手動の例: http://docs.djangoproject.com/en/1.0/topics/forms/formsets/#formset-validation (私はDjango 1.0.3を使用してGoogle App Engineで実行しています)
コード:
from django import forms
from django.forms.formsets import formset_factory
class ArticleForm1(forms.Form):
title = forms.CharField()
pub_date = forms.DateField()
class ArticleForm2(forms.Form):
title = forms.CharField()
class ArticleForm3(forms.Form):
title = forms.CharField()
pub_date = forms.CharField()
ArticleFormSet1 = formset_factory(ArticleForm1)
ArticleFormSet2 = formset_factory(ArticleForm2)
ArticleFormSet3 = formset_factory(ArticleForm3)
data = {
"form-TOTAL_FORMS": u"2",
"form-INITIAL_FORMS": u"0",
"form-0-title": u"",
"form-0-pub_date": u"16 June 1904",
"form-1-title": u"", # <-- this title is missing but required
"form-1-pub_date": u"16 June 1904", # <-- this date is missing but required
}
formset = ArticleFormSet1(data)
print "Should be False: %s" % formset.is_valid()
formset = ArticleFormSet2(data)
print "Should be False: %s" % formset.is_valid()
formset = ArticleFormSet3(data)
print "Should be False: %s" % formset.is_valid()
出力:
$ .../ActiveStatePython2.5/python.exe formset_bug.py
Should be False: False
Should be False: True
Should be False: False
ActiveState Python 2.5.4.4、Django 1.0.3最終版。
CharFieldが1つだけの場合は検証されないように見えます(ただし、2つのCharFieldsまたはCharFieldとDateFieldが機能します)。
私はそのようなバグをGoogleで探し、何も見つけられませんでした。まだDjango 1.1を試していませんが、今のところGAEで1.0を使用する方がはるかに簡単です。
回答:
回答№1の場合は7さて、私はDjangoについてもっと理解しました。これはバグではありません。
から http://docs.djangoproject.com/en/1.0/topics/forms/formsets/#formset-validation:
「フォームセットは、変更されていない余分なフォームを無視できるほどスマートです。」
から Django Formset.is_valid()が追加のフォームで失敗する:
「フォームセットは、すべての「追加」フォームにempty_permitted = Trueを渡します。変更されていないempty_permittedのフォームは、常に検証に合格する必要があります。」
form-TOTAL_FORMSをu "2"に設定すると、余分なものはなくなり、検証は期待どおりになります。
2番目のフィールドの一部がある場合(DateFieldまたはCharFieldとして)、フィールドにはいくつかのものがあり、余分ではなくなります。