我一直试图弄清为什么form.is_valid总是返回false,但是我仍然没有弄清楚,这对我刚开始使用Django还是没有帮助的。
模型
class Post(models.Model):
STATUS_CHOICES = (
('d', 'Draft'),
('p', 'Published'),
)
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=120, null=True, blank=True)
text = models.TextField(max_length=500, null=True, blank=True)
slug = models.SlugField(max_length=40, unique=True)
publish_date = models.DateTimeField(null=True)
status = models.CharField(choices=STATUS_CHOICES, max_length=1,default='d')
表格
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title','author','slug','text','publish_date','status')
widgets = {
'title': forms.TextInput(attrs={'class' : 'form-control', 'placeholder' : 'Title'}),
'author': forms.Select(),
'slug': forms.TextInput(attrs={'class' : 'form-control', 'placeholder' : 'Slug'}),
'text': forms.Textarea(attrs={'class' : 'form-control', 'placeholder' : 'Text'}),
'publish_date': forms.DateInput(attrs={'class' : 'form-control', 'placeholder' : date.today}),
'status': forms.NullBooleanSelect(attrs={'class' : 'form-control'}),
}
查看
def admin(request):
if request.user.is_authenticated:
if request.user.is_staff:
users = User.objects.all().order_by('date_joined').reverse()[:5]
posts = Post.objects.all().order_by('created').reverse()[:5]
publications = Publication.objects.all().order_by('created').reverse()[:5]
form = PostForm()
args = {'profile' : users ,'posts' : posts, 'publications' : publications, 'form' : form }
if request.POST:
print('request is posting')
if form.is_valid():
form.save()
else:
print('Error in saving')
return render(request, 'webadmin/index.html',args)
else:
return index(request)
else:
return redirect('/webmaster/login/')
我希望您能为我提供帮助,谢谢OWO)/
答案 0 :(得分:0)
这里:
form = PostForm()
if request.POST:
if form.is_valid():
您正在尝试验证未绑定的表单,该表单肯定会失败-您必须传递数据(在这种情况下为request.POST
)才能进行验证。您的代码实际上应该类似于:
# explicitely test against request.method -
# you can have a POST request with an empty body,
# in which case `request.POST` will be empty and
# have a false value in a boolean test
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
# ...
现在即使通过request.POST
也不意味着您的表单将必须通过验证,但是仅打印诸如“'保存时出错'”之类的内容并不能告诉您什么地方有问题或遗漏。
无效的表单具有.errors
属性,该属性列出了所有验证错误。如果您使用{{ form }}
(或它们的变体{{ form.as_p }}
,{{ form.as_table }}
等在模板中呈现表单,这些验证错误将自动显示在模板中(您未在此处发布)。您是手动呈现表单,还必须考虑自己呈现错误as documented here(我希望您至少是使用表单的字段进行呈现,而不是手动编写所有html表单代码。 ..)。
在所有情况下,您至少可以从在视图中打印form.errors
开始,这样您就可以知道哪些内容无效,即:
if form.is_valid():
form.save()
else:
print("errors : {}".format(form.errors))
请注意,所有这些都已明确记录在案,因此您可以自己找到答案。我了解Django是一个相当大的框架,需要花费一些时间来掌握它,但是它有一个很好的教程和包含许多示例的大量文档,因此您应该真正地做一下教程并开始浏览文档,至少了解当某些“行不通”时可以在哪里找到以及在哪里进行搜索。