Commits

russ...@bcc190cf-cafb-0310-a4f2-bffc1f526a37  committed ce379c3

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

  • Participants
  • Parent commits 5cd50e5

Comments (0)

Files changed (2)

File django/forms/models.py

                         # poke error messages into the right places and mark
                         # the form as invalid
                         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
                         break
                     # mark the data as seen
                         # poke error messages into the right places and mark
                         # the form as invalid
                         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
                         break
                     seen_data.add(data)

File tests/regressiontests/model_formsets_regress/tests.py

 from django import forms
+from django.forms.util import ErrorDict, ErrorList
 from django.forms.models import modelform_factory, inlineformset_factory, modelformset_factory
 from django.test import TestCase
 
             ["<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):
     pass