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
字段隐藏在表单中。非常感谢!不仅感谢您的回答,也感谢您的解释!)