Это ошибка в проверке формы Django? - PullRequest
4 голосов
/ 20 августа 2009

Ручной пример: 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 final.

Похоже, что он не проверяется в случае только одного CharField (но работает 2 CharFields или CharField и DateField).

Я гуглил такую ​​ошибку и не смог ничего найти. Я еще не пробовал Django 1.1, но сейчас гораздо проще использовать 1.0 в GAE.

1 Ответ

7 голосов
/ 20 августа 2009

Хорошо, теперь я понимаю больше о Джанго. Это не ошибка.

С http://docs.djangoproject.com/en/1.0/topics/forms/formsets/#formset-validation:

"Формсет достаточно умен, чтобы игнорировать дополнительные формы, которые не были изменены."

С Django Formset.is_valid () не работает для дополнительных форм :

"Formsets pass empty_permitted = True для всех" лишних "форм, и форма с empty_permitted, которая не была изменена, всегда должна проходить проверку."

Когда я устанавливаю для form-TOTAL_FORMS значение u'2 ', он больше не имеет никакого дополнительного значения, и проверка выполняет то, что я ожидаю.

Когда есть часть второго поля (как DateField или CharField), поле имеет некоторые элементы и больше не является дополнительным.

...