diff options
| author | Joseph Kocherhans <joseph@jkocherhans.com> | 2010-02-23 21:09:27 +0000 |
|---|---|---|
| committer | Joseph Kocherhans <joseph@jkocherhans.com> | 2010-02-23 21:09:27 +0000 |
| commit | 860497c9b3f2f54ef71cb55b5b59dbb9f24dfccd (patch) | |
| tree | 0c5b0f4167f3c5dec237a7d20b591a8f2e366e9c | |
| parent | a1bff5f823687ba9c3b83915e28f35e20fe5641a (diff) | |
[1.1.x] Fixed #12878. Formset-wide errors are now rendered properly as html. Backport of r12548 from trunk.
git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12549 bcc190cf-cafb-0310-a4f2-bffc1f526a37
| -rw-r--r-- | django/forms/formsets.py | 2 | ||||
| -rw-r--r-- | tests/regressiontests/admin_views/tests.py | 17 | ||||
| -rw-r--r-- | tests/regressiontests/forms/formsets.py | 16 |
3 files changed, 34 insertions, 1 deletions
diff --git a/django/forms/formsets.py b/django/forms/formsets.py index bb8e3107e1..52905c282f 100644 --- a/django/forms/formsets.py +++ b/django/forms/formsets.py @@ -252,7 +252,7 @@ class BaseFormSet(StrAndUnicode): try: self.clean() except ValidationError, e: - self._non_form_errors = e.messages + self._non_form_errors = self.error_class(e.messages) def clean(self): """ diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index 8514c13c11..07e3385cb3 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -10,6 +10,7 @@ from django.contrib.admin.models import LogEntry, DELETION from django.contrib.admin.sites import LOGIN_FORM_KEY from django.contrib.admin.util import quote from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME +from django.forms.util import ErrorList from django.utils.cache import get_max_age from django.utils.html import escape @@ -966,6 +967,22 @@ class AdminViewListEditable(TestCase): response = self.client.post('/test_admin/admin/admin_views/person/', data) self.assertContains(response, "Grace is not a Zombie") + def test_non_form_errors_is_errorlist(self): + # test if non-form errors are correctly handled; ticket #12878 + data = { + "form-TOTAL_FORMS": "1", + "form-INITIAL_FORMS": "1", + "form-MAX_NUM_FORMS": "0", + + "form-0-id": "2", + "form-0-alive": "1", + "form-0-gender": "2", + } + response = self.client.post('/test_admin/admin/admin_views/person/', data) + non_form_errors = response.context['cl'].formset.non_form_errors() + self.assert_(isinstance(non_form_errors, ErrorList)) + self.assertEqual(str(non_form_errors), str(ErrorList(["Grace is not a Zombie"]))) + def test_list_editable_ordering(self): collector = Collector.objects.create(id=1, name="Frederick Clegg") diff --git a/tests/regressiontests/forms/formsets.py b/tests/regressiontests/forms/formsets.py index dd2b188fd2..2688d61425 100644 --- a/tests/regressiontests/forms/formsets.py +++ b/tests/regressiontests/forms/formsets.py @@ -598,4 +598,20 @@ Make sure the management form has the correct prefix. >>> formset.management_form.prefix 'form' +# Regression test for #12878 ################################################# + +>>> data = { +... 'drinks-TOTAL_FORMS': '2', # the number of forms rendered +... 'drinks-INITIAL_FORMS': '0', # the number of forms with initial data +... 'drinks-MAX_NUM_FORMS': '0', # max number of forms +... 'drinks-0-name': 'Gin and Tonic', +... 'drinks-1-name': 'Gin and Tonic', +... } + +>>> formset = FavoriteDrinksFormSet(data, prefix='drinks') +>>> formset.is_valid() +False +>>> print formset.non_form_errors() +<ul class="errorlist"><li>You may only specify a drink once.</li></ul> + """ |
