django formsets confusion(validation,required,empty_permitted)

Cri*_*cri 11 django django-forms

我真的发现django formsets令人困惑.

我特别遇到以下概念的问题,我并不理解:

formset足够聪明,可以忽略未更改的额外表单.

谈论代码试图太聪明.这应该是什么意思?为什么我甚至想要那个?

然后,试图理解以前的概念,我看到了人

在所需的表格中制作表格.

这是另一个我无法理解的概念.什么是表格中的必填表格,为什么我需要制作表格?再一次没有记录.

然后来到我的实际问题,其他人似乎已经有了,但他们无法真正解释为什么他们修复它的方式他们修复它.

为什么在以下示例中,formset是有效的,而具有相同输入的单个表单将无效?

import django
class MyForm(django.forms.Form):
    start = django.forms.DateField()
    end = django.forms.DateField()

data =  {
    'form-TOTAL_FORMS': '1',
    'form-MAX_NUM_FORMS': '',
    'form-INITIAL_FORMS': '0',
    'form-0-start': '',
    'form-0-end': '',
}

MyFormSet = formset_factory(MyForm)
formset = MyFormSet(data)
#fee_forms[0].empty_permitted = False

print formset.is_valid()
# --- returns True ---
print formset.errors

f = MyForm({'start': '', 'end': ''})
print f.is_valid()
# --- returns False ---
print f.errors
Run Code Online (Sandbox Code Playgroud)

将empty_permitted设置为False似乎为我提供了预期的结果(由于缺少'start'和'end',formset无效).这是另一个未记载的功能......

有人花些时间解释一下吗?

谢谢

sup*_*cuo 16

formset足够聪明,可以忽略未更改的额外表单.

谈论代码试图太聪明.这应该是什么意思?为什么我甚至想要那个?

这似乎意味着 - 当你解决了 - 由formset(extra=N在你的例子中)创建的"额外"表单已empty_permitted设置为True.瞥一眼django/forms/formsets.py就能发现这种情况.

formset[0].empty_permitted意味着如果formset[0].has_changed() == False没有进行进一步的处理/验证.再次,你可以看到这在行动中forms/forms.py.

为了防止这种情况,博客文章建议定义要在modelformset_factory(或inlineformset_factory)中使用的自定义表单集empty_permitted = False:

class MyModelFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(MyModelFormSet, self).__init__(*args, **kwargs)
        for form in self.forms:
            form.empty_permitted = False
Run Code Online (Sandbox Code Playgroud)

我没有测试过这个,但看起来合法.

至于为什么有人可能想要这个,它使得使用 django-dynamic-formset更简单 - 你可以发送数据form-0form-2和,假设form-1是一个额外的形式(没有链接到模型数据),Django不会抱怨.如果empty_permittedFalse默认情况下,您必须担心在自己的代码中跳过空白表单,或者在Javascript中重新编制索引.