当Form Class只有一个字段时,Django Formset is_valid返回“True”,但该字段为空

时间:2014-06-17 06:43:51

标签: django field formset

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.']}]

1 个答案:

答案 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

如果这是一个字段形式,检查一个字段并没有太大的损失。