当表单类只有一个字段时,Django Formset is_valid 返回 "True",尽管该字段为空

标签 django field formset

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/

相关文章:

syntax - 复制 OCaml 中的字段

c - 我书中带有位字段的结构的大小不准确

django - 将自定义表单参数传递给表单集

python - 表单集中所需的第一个表单

python - Django Twoscoops 和 SECRET_KEY 生成

python - Windows10 的 Docker 运行 django 失败 : Can't open file 'manage.py' : [Errno 2] No such file or directory

jquery - 如何在不重新加载页面(AJAX)的情况下更新 django 模板变量?

django - 如何在django中实现拖放上传文件,而我已经实现了简单的文件上传

java - 确定字段的访问级别