use*_*217 2 django field formset
Formset is_valid 返回“True,但当 Form Class 只有一个字段时,该字段为空。
我使用“python manage.py shell”制作了这个示例。
如您所见,当“ArticleForm”类只有标题字段时,表单集的is_valid 函数返回“True”。
我看到有人因为这个问题而使用了 has_changed 函数。
但我认为这不是解决这个问题的好方法。
from django import forms
from django.forms.formsets import formset_factory
class ArticleForm(forms.Form):
title = forms.CharField()
ArticleFormSet = formset_factory(ArticleForm)
data = {
'form-TOTAL_FORMS': '2',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '',
'form-0-title': 'Test',
'form-1-title': '',
}
formset = ArticleFormSet(data)
formset.is_valid()
#True - I think it has to be "False" because the "form-1-title' is empty
formset.errors
#[{}, {}]
class ArticleForm(forms.Form):
title = forms.CharField()
pub_date = forms.DateField()
ArticleFormSet = formset_factory(ArticleForm)
data = {
'form-TOTAL_FORMS': '2',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '',
'form-0-title': 'Test',
'form-0-pub_date': '1904-06-16',
'form-1-title': '',
'form-1-pub_date': '1904-06-16',
}
formset = ArticleFormSet(data)
formset.is_valid()
#False - It's working. I think the reason is the pub_date field.
formset.errors
#[{}, {'title': [u'This field is required.']}]
Run Code Online (Sandbox Code Playgroud)
这是空表单上的默认 Django 行为。如果 Django 注意到您有一个完全空的表单,它会在运行验证时忽略它。在第二个示例中,您的表单不为空,因为 DateField 设置了值。
如果您查看 Django 内联,您就会发现这种行为的优点。想象一下你已经设置了
extra = 3
Run Code Online (Sandbox Code Playgroud)
在您的 InlineAdmin 中。用户填写 2 个内联表格并省略第三个。然后,这两种形式都会得到正确的验证,并且正如人们所期望的那样,空的形式会被忽略。
为了验证单字段表单,您可以检查 clean_data:
if formset.is_valid():
is_really_valid = True
for form in formset.forms:
if not form.cleaned_data.has_key('title'):
is_really_valid = False
break
Run Code Online (Sandbox Code Playgroud)
如果这是一个单字段表单,那么检查一个字段并不会造成太大影响。
| 归档时间: |
|
| 查看次数: |
2183 次 |
| 最近记录: |