【问题标题】:django formsets confusion (validation, required, empty_permitted)django 表单集混淆(验证,必需,empty_permitted)
【发布时间】:2012-11-24 14:00:57
【问题描述】:

我真的发现 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_permitted 设置为 False 似乎给了我预期的结果(这是由于缺少“开始”和“结束”而导致表单集无效)。这是另一个未记录的功能...

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

谢谢

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    表单集足够智能,可以忽略未更改的额外表单。

    谈论过于聪明的代码。这应该是什么意思?为什么我什至想要那个?

    这似乎意味着 - 正如你所计算的那样 - 由表单集创建的“额外”表单(在你的示例中使用 extra=N)将 empty_permitted 设置为 TrueHave a glance at django/forms/formsets.py 看到这种情况发生。

    formset[0].empty_permitted 表示如果formset[0].has_changed() == False,则不进行进一步处理/验证。再次,you can see this in action in forms/forms.py

    为了防止这种情况a blog post suggests 定义一个自定义表单集以在 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
    

    我没有对此进行测试,但它看起来是合法的。

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

    【讨论】:

      猜你喜欢
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      相关资源
      最近更新 更多