Formset is_valid返回“如果Form Class只有一个字段,则该字段为空。”
我使用“python manage.py shell”制作了这个例子
如您所见,当“ArticleForm”类只有title字段时,formset的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.']}]
答案 0 :(得分:4)
这是空表单上的默认Django行为。如果Django注意到你有一个完全空的表单,它会在运行验证时忽略它。在第二个示例中,您的表单不为空,因为DateField具有值集。
如果你看一下Django内联,你可以看到这种行为的优势。想象一下,你已经设置了
extra = 3
在你的InlineAdmin中。用户填写2个内联表单,而不是第3个。然后正确验证这两种形式,并按照人们的预期忽略空的形式。
为了验证一个字段表单,您可以检查您的cleaning_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
如果这是一个字段形式,检查一个字段并没有太大的损失。