django表单集混乱(验证、必需、允许为空)

django表单集混乱(验证、必需、允许为空),django,django-forms,Django,Django Forms,我真的觉得django表单集很混乱 我尤其对以下我不太理解的概念有问题: 表单集足够聪明,可以忽略那些不需要的额外表单 变了 谈论试图变得太聪明的代码。这到底是什么意思?我为什么要那样 然后,试图理解前面的概念,我看到了人们 在所需的表单集中制作表单 这是另一个我搞不懂的概念。什么是表单集中的必填表单?为什么我必须生成必填表单?同样,有些东西没有记录在案 然后是我的实际问题,其他人似乎也有过,但他们不能真正解释为什么他们用他们的方式来解决它 为什么在下面的示例中,表单集有效,而具有相同输入的单个

我真的觉得django表单集很混乱

我尤其对以下我不太理解的概念有问题:

表单集足够聪明,可以忽略那些不需要的额外表单 变了

谈论试图变得太聪明的代码。这到底是什么意思?我为什么要那样

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

在所需的表单集中制作表单

这是另一个我搞不懂的概念。什么是表单集中的必填表单?为什么我必须生成必填表单?同样,有些东西没有记录在案

然后是我的实际问题,其他人似乎也有过,但他们不能真正解释为什么他们用他们的方式来解决它

为什么在下面的示例中,表单集有效,而具有相同输入的单个表单无效

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
将empty_allowed设置为False似乎为我提供了预期的结果(即表单集由于缺少“start”和“end”而无效)。这是另一个未记录的功能

有人能抽出时间解释一下吗

多谢各位

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

谈论试图变得太聪明的代码。这到底是什么意思?我为什么要那样

这似乎意味着——正如您所计算的那样——由表单集创建的“额外”表单(在您的示例中使用
extra=N
)已将
空设置为
True
。看到这种情况发生

formset[0]。允许为空表示如果
formset[0]。已更改()==False
,则不会进行进一步的处理/验证。再次

为防止出现这种情况,请定义一个自定义表单集以在
modelformset\u工厂
(或
inlineformset\u工厂
)中使用,其中设置
empty\u allowed=False

class MyModelFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(MyModelFormSet, self).__init__(*args, **kwargs)
        for form in self.forms:
            form.empty_permitted = False
我还没有测试过这个,但它看起来是合法的

至于为什么会有人想要这个,这就需要使用 更简单-您可以发送
form-0
form-2
的数据,并且假设
form-1
是一个额外的表单(即未链接到模型数据),Django不会抱怨。默认情况下,如果<代码> AppTyjRead 是<代码> false ,您将不得不担心在自己的代码中跳过空白表单,或者在JavaScript中重新索引东西。