4

手動の例:http://docs.djangoproject.com/en/1.0/topics/forms/formsets/#formset-validation (Google App Engine で実行するために Django 1.0.3 を使用しています)

コード:

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つのCharFieldまたはCharFieldとDateFieldが機能します)。

私はそのようなバグをグーグルで検索しましたが、何も見つかりませんでした。Django 1.1 はまだ試していませんが、今のところ GAE で 1.0 を使用する方がはるかに簡単です。

4

1 に答える 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 のいずれか) の一部がある場合、そのフィールドには何らかの要素があり、余分なものではなくなります。

于 2009-08-20T19:22:04.113 に答える