Python ';用户';字段一直为空

Python ';用户';字段一直为空,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我想创建一些当前登录用户可以创建“帖子”的东西。这是我的密码: models.py from django.contrib.auth.models import User # Posts class Post(models.Model): user = models.ForeignKey(User) date = models.DateField(auto_now_add=True) content = models.TextField(max_length=500,

我想创建一些当前登录用户可以创建“帖子”的东西。这是我的密码:

models.py

from django.contrib.auth.models import User

# Posts
class Post(models.Model):
    user = models.ForeignKey(User)
    date = models.DateField(auto_now_add=True)
    content = models.TextField(max_length=500, blank=False)
class PostForm(forms.ModelForm):
    class Meta:
        model = models.Post
        labels = {
            'content': ''
        }
        widgets = {
            'user': forms.HiddenInput()
        }
        fields = '__all__'
        # exclude = ('user',)
def my_profile(request):
    user = request.user
    profile_info = request.user.userprofileinfo

    if request.method == 'POST':
        post = forms.PostForm(data=request.POST)

        if post.is_valid():
            post.save(commit=False)
            post.user = user

            post.save(commit=True)
            return HttpResponseRedirect(reverse('td_app:index'))
        else:
            print(post.errors)
            return HttpResponseRedirect(reverse('td_app:my_profile'))
    else:
        form = forms.PostForm

        data = {
            'user': user,
            'profile_info': profile_info,
            'form': form
        }

        return render(request, 'td_app/my_profile.html', context=data)
forms.py

from django.contrib.auth.models import User

# Posts
class Post(models.Model):
    user = models.ForeignKey(User)
    date = models.DateField(auto_now_add=True)
    content = models.TextField(max_length=500, blank=False)
class PostForm(forms.ModelForm):
    class Meta:
        model = models.Post
        labels = {
            'content': ''
        }
        widgets = {
            'user': forms.HiddenInput()
        }
        fields = '__all__'
        # exclude = ('user',)
def my_profile(request):
    user = request.user
    profile_info = request.user.userprofileinfo

    if request.method == 'POST':
        post = forms.PostForm(data=request.POST)

        if post.is_valid():
            post.save(commit=False)
            post.user = user

            post.save(commit=True)
            return HttpResponseRedirect(reverse('td_app:index'))
        else:
            print(post.errors)
            return HttpResponseRedirect(reverse('td_app:my_profile'))
    else:
        form = forms.PostForm

        data = {
            'user': user,
            'profile_info': profile_info,
            'form': form
        }

        return render(request, 'td_app/my_profile.html', context=data)
views.py

from django.contrib.auth.models import User

# Posts
class Post(models.Model):
    user = models.ForeignKey(User)
    date = models.DateField(auto_now_add=True)
    content = models.TextField(max_length=500, blank=False)
class PostForm(forms.ModelForm):
    class Meta:
        model = models.Post
        labels = {
            'content': ''
        }
        widgets = {
            'user': forms.HiddenInput()
        }
        fields = '__all__'
        # exclude = ('user',)
def my_profile(request):
    user = request.user
    profile_info = request.user.userprofileinfo

    if request.method == 'POST':
        post = forms.PostForm(data=request.POST)

        if post.is_valid():
            post.save(commit=False)
            post.user = user

            post.save(commit=True)
            return HttpResponseRedirect(reverse('td_app:index'))
        else:
            print(post.errors)
            return HttpResponseRedirect(reverse('td_app:my_profile'))
    else:
        form = forms.PostForm

        data = {
            'user': user,
            'profile_info': profile_info,
            'form': form
        }

        return render(request, 'td_app/my_profile.html', context=data)
我已将“用户”字段声明为“隐藏”,因为我们不希望用户在发布时假装是其他人——“用户”字段应自动注册当前登录的用户。然而,它总是给我这个错误:
  • 用户
    • 此字段为必填字段。

当我这样做时:

class PostForm(forms.ModelForm):
    class Meta:
        model = models.Post
        labels = {
            'content': ''
        }
        # widgets = {
        #     'user': forms.HiddenInput()
        # }
        fields = '__all__'
        exclude = ('user',)
现在它将给我一个空错误:
上述异常(列“user\u id”中的null值违反了非null约束

我对Django比较陌生,所以请原谅我的天真。 怎么能解决这个问题?非常感谢

然而,它总是给我这个错误:
这个字段是必需的。

这是因为表单中有
user
字段(即使它是一个隐藏字段),但它没有任何值(我认为默认情况下所有字段都是必需的),因此表单验证需要抱怨缺少字段值

我的建议是从表单中删除
user
字段(使用
exclude=('user',)
您已经在那里注释掉了),然后注入
请求。在调用
save()
之前,user
。设置
post.user=user
不会做任何事情(或者至少不会做您认为它会做的事情),因为变量
post
实际上不是
post
模型的实例,而是
PostForm
的实例。将要保存的模型实例可在
post.instance
中找到。所以您要做的是

form = forms.PostForm(data=request.POST)
form.instance.user = request.user
form.save()
至于您的表单在
user
字段中没有任何值的原因,是因为您没有用任何数据填充表单。为此,您必须使用表单的参数:

else:
    # now the form will contain `user` value
    form = forms.PostForm(initial={'user': user})

但我还是建议将
user
字段隐藏在表单中。

非常感谢!不仅感谢您的回答,也感谢您的解释!)