【问题标题】:Django Formset is_valid returns "True" though the field is empty when Form Class has only one field当表单类只有一个字段时,Django Formset is_valid 返回“True”,尽管该字段为空
【发布时间】:2014-08-07 01:54:09
【问题描述】:

当表单类只有一个字段时,Formset is_valid 返回“虽然字段为空,但为真。
我使用“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 field formset


    【解决方案1】:

    这是空表单上的默认 Django 行为。如果 Django 注意到你有一个完全空的表单,它会在运行验证时忽略它。在您的第二个示例中,您的表单不是空的,因为 DateField 设置了一个值。

    如果您查看 Django 内联,您会看到这种行为的优势。想象一下你已经设置了

    extra = 3
    

    在您的 InlineAdmin 中。用户填写 2 个内联表单并忽略第三个。然后正确地验证这两种形式,并且可以预期的那样忽略空的形式。

    为了验证单字段表单,您可以检查您的cleaned_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
    

    如果这是一个单字段的表单,检查一个字段并没有太大的伤害。

    【讨论】:

      猜你喜欢
      • 2019-03-22
      • 2013-06-29
      • 2017-03-07
      • 1970-01-01
      • 2012-07-04
      • 2013-07-02
      • 2022-01-23
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多