Fixed #15167 -- Ensure that non-form errors are always part of an ErrorList. Thanks to Harm Geerts for the report and patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15424 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2011-02-05 06:33:16 +00:00
parent 7f65c338fc
commit b3085f8ae5
2 changed files with 28 additions and 2 deletions

View File

@ -511,7 +511,7 @@ class BaseModelFormSet(BaseFormSet):
# poke error messages into the right places and mark # poke error messages into the right places and mark
# the form as invalid # the form as invalid
errors.append(self.get_unique_error_message(unique_check)) errors.append(self.get_unique_error_message(unique_check))
form._errors[NON_FIELD_ERRORS] = self.get_form_error() form._errors[NON_FIELD_ERRORS] = self.error_class([self.get_form_error()])
del form.cleaned_data del form.cleaned_data
break break
# mark the data as seen # mark the data as seen
@ -542,7 +542,7 @@ class BaseModelFormSet(BaseFormSet):
# poke error messages into the right places and mark # poke error messages into the right places and mark
# the form as invalid # the form as invalid
errors.append(self.get_date_error_message(date_check)) errors.append(self.get_date_error_message(date_check))
form._errors[NON_FIELD_ERRORS] = self.get_form_error() form._errors[NON_FIELD_ERRORS] = self.error_class([self.get_form_error()])
del form.cleaned_data del form.cleaned_data
break break
seen_data.add(data) seen_data.add(data)

View File

@ -1,4 +1,5 @@
from django import forms from django import forms
from django.forms.util import ErrorDict, ErrorList
from django.forms.models import modelform_factory, inlineformset_factory, modelformset_factory from django.forms.models import modelform_factory, inlineformset_factory, modelformset_factory
from django.test import TestCase from django.test import TestCase
@ -200,6 +201,31 @@ class InlineFormsetTests(TestCase):
["<Host: matrix.de.eu.dal.net>", "<Host: tranquility.hub.dal.net>"] ["<Host: matrix.de.eu.dal.net>", "<Host: tranquility.hub.dal.net>"]
) )
class FormsetTests(TestCase):
def test_error_class(self):
'''
Test the type of Formset and Form error attributes
'''
Formset = modelformset_factory(User)
data = {
'form-TOTAL_FORMS': u'2',
'form-INITIAL_FORMS': u'0',
'form-MAX_NUM_FORMS': u'0',
'form-0-id': '',
'form-0-username': u'apollo13',
'form-0-serial': u'1',
'form-1-id': '',
'form-1-username': u'apollo13',
'form-1-serial': u'2',
}
formset = Formset(data)
# check if the returned error classes are correct
# note: formset.errors returns a list as documented
self.assertTrue(isinstance(formset.errors, list))
self.assertTrue(isinstance(formset.non_form_errors(), ErrorList))
for form in formset.forms:
self.assertTrue(isinstance(form.errors, ErrorDict))
self.assertTrue(isinstance(form.non_field_errors(), ErrorList))
class CustomWidget(forms.CharField): class CustomWidget(forms.CharField):
pass pass