首页 > 解决方案 > 用户未与帖子模型关联

问题描述

我试图让当前登录的用户成为author他们从 Post 模型创建的帖子的用户。到目前为止,他们在表格中填写的所有信息都被收集并成功存储在数据库中,但用户除外。目前它显示没有用户登录,我不确定为什么会这样。我试过提出请求。user 和 instance=request.user 用于 POST 和 GET 请求,到目前为止似乎没有任何效果。

视图.py

def create(request):
    form = PostForm(request.POST or None, request.FILES or None)
    if form.is_valid():
        instance = form.save(commit=False)
        instance.user = request.user
        instance.save()
        return render(request, 'classifieds/latest-ads.html')
    else:
        form = PostForm(instance=request.user)
        args = {'form': form}
        return render(request, 'classifieds/create-post.html', args)

模型.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Post(models.Model):

    title = models.CharField(max_length=150)
    price = models.CharField(max_length=100)
    body = models.TextField()
    contact_email = models.CharField(max_length=80, null=True)
    contact_number = models.IntegerField(default=250, null=True)
    pub_date = models.DateTimeField(null=True)
    author = models.ForeignKey(User, null=True)
    category = models.CharField(max_length=150, null=True)
    picture = models.ImageField(upload_to='ad_pictures', default='')



    def __str__(self):
        return self.title

表格.py

from django import forms
from .models import Post
from django.contrib.auth.models import User

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = (
            'price',
            'title',
            'body',
            'author',
            'contact_email',
            'contact_number',
            'picture',
        )

create-post.html渲染为模板的图片form.as_p。请注意,该Author字段为空白。如果我从下拉列表中选择正确的作者,则帖子将按原样保存。但是,我无法让登录用户显示出来。

任何意见是极大的赞赏。

标签: djangoformsmodel

解决方案


User 的外键字段的名称称为author。但是您正在尝试使用名为 的未命名字段将用户添加到帖子中user

create视图中,在行:

...
instance.user = request.user
#        ^^^^ this is your mistake
...

你需要使用instance.author = request.user.


更新:您还需要author从 ModelForm 中排除外键字段。

我不知道必须排除外键字段的确切原因,但如果我找到答案,我会更新答案。这很可能是一个错误,因为文档没有提到这样的事情。


推荐阅读