Formset is_valid 返回“当表单类只有一个字段时,尽管该字段为空,但仍为 True。
我使用“python manage.py shell”制作了这个示例。
如您所见,当“ArticleForm”类只有标题字段时,表单集的 is_valid 函数返回“True”。
我看到有人因为这个问题而使用了 has_changed 函数。
但我认为这不是解决这个问题的好方法。
from django import forms
from django.forms.formsets import formset_factory
class ArticleForm(forms.Form):
title = forms.CharField()
ArticleFormSet = formset_factory(ArticleForm)
data = {
'form-TOTAL_FORMS': '2',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '',
'form-0-title': 'Test',
'form-1-title': '',
}
formset = ArticleFormSet(data)
formset.is_valid()
#True - I think it has to be "False" because the "form-1-title' is empty
formset.errors
#[{}, {}]
class ArticleForm(forms.Form):
title = forms.CharField()
pub_date = forms.DateField()
ArticleFormSet = formset_factory(ArticleForm)
data = {
'form-TOTAL_FORMS': '2',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '',
'form-0-title': 'Test',
'form-0-pub_date': '1904-06-16',
'form-1-title': '',
'form-1-pub_date': '1904-06-16',
}
formset = ArticleFormSet(data)
formset.is_valid()
#False - It's working. I think the reason is the pub_date field.
formset.errors
#[{}, {'title': [u'This field is required.']}]
最佳答案
这是空表单上的默认 Django 行为。如果 Django 注意到您有一个完全空的表单,它会在运行验证时忽略它。在第二个示例中,您的表单不为空,因为 DateField 设置了值。
如果您查看 Django 内联,您就会发现这种行为的优点。想象一下你已经设置了
extra = 3
在您的 InlineAdmin 中。用户填写 2 个内联表格并省略第三个。然后,这两种形式都会被正确验证,空的形式会被忽略,正如人们所期望的那样。
为了验证单字段表单,您可以检查 clean_data:
if formset.is_valid():
is_really_valid = True
for form in formset.forms:
if not form.cleaned_data.has_key('title'):
is_really_valid = False
break
如果这是单字段表单,那么检查一个字段并不会造成太大影响。
关于当表单类只有一个字段时,Django Formset is_valid 返回 "True",尽管该字段为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24257263/