gpt4 book ai didi

django 表单集混淆(验证、必需、empty_permitted)

转载 作者:行者123 更新时间:2023-12-04 01:54:45 28 4
gpt4 key购买 nike

我真的发现 django 表单集令人困惑。

我尤其对以下我不太了解的概念有疑问:

The formset is smart enough to ignore extra forms that were not changed.



谈论试图过于聪明的代码。这到底是什么意思?为什么我会想要那个?

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

making forms in the formsets required.



这是我无法掌握的另一个概念。什么是表单集中的必需表单,为什么我必须制作必需的表单?再次没有记录的东西。

然后谈到我的实际问题,其他人似乎也遇到过这个问题,但他们无法真正解释为什么他们以他们修复的方式修复它。

为什么在下面的例子中,表单集是有效的,而具有相同输入的单个表单将是无效的?
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 似乎为我提供了预期的结果(由于缺少“开始”和“结束”,表单集无效)。这是另一个未记录的功能......

有人会花点时间解释一下吗?

谢谢

最佳答案

The formset is smart enough to ignore extra forms that were not changed.


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

这似乎意味着——正如你所计算出的——由表单集创建的“额外”表单(在你的例子中是 extra=N)有 empty_permitted设置为 True . Have 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-0 发送数据和 form-2并且,假设 form-1是一个额外的形式(即不链接到模型数据),Django 不会提示。如 empty_permitted分别是 False默认情况下,您必须担心在自己的代码中跳过空白表单,或者在 Javascript 中重新索引内容。

关于django 表单集混淆(验证、必需、empty_permitted),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13745343/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com