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-0和form-2和,假设form-1是一个额外的形式(即没有链接到模型数据),Django不会抱怨.如果empty_permitted是False默认情况下,您必须担心在自己的代码中跳过空白表单,或者在Javascript中重新编制索引.
| 归档时间: |
|
| 查看次数: |
6972 次 |
| 最近记录: |