summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Maslov <greyzmeem@gmail.com>2014-12-23 17:51:36 +0200
committerTim Graham <timograham@gmail.com>2014-12-31 14:46:17 -0500
commit8de2a44064ca11749579a5887f59821fa35e1fdc (patch)
treec00eed71805594a8af624fcb4c6b4df1fa763cd4
parent4abfa73c1861c53d43f0448726346866b04b9b72 (diff)
[1.7.x] Fixed #24008 -- Fixed ValidationError crash with list of dicts.
Backport of 7a878ca5cb50ad65fc465cb263a44cc93629f75c from master
-rw-r--r--django/core/exceptions.py5
-rw-r--r--docs/releases/1.7.2.txt3
-rw-r--r--tests/forms_tests/tests/test_utils.py26
3 files changed, 31 insertions, 3 deletions
diff --git a/django/core/exceptions.py b/django/core/exceptions.py
index 28e712e0a5..0e333d06e5 100644
--- a/django/core/exceptions.py
+++ b/django/core/exceptions.py
@@ -118,7 +118,10 @@ class ValidationError(Exception):
# Normalize plain strings to instances of ValidationError.
if not isinstance(message, ValidationError):
message = ValidationError(message)
- self.error_list.extend(message.error_list)
+ if hasattr(message, 'error_dict'):
+ self.error_list.extend(sum(message.error_dict.values(), []))
+ else:
+ self.error_list.extend(message.error_list)
else:
self.message = message
diff --git a/docs/releases/1.7.2.txt b/docs/releases/1.7.2.txt
index c4938530e4..1070946d83 100644
--- a/docs/releases/1.7.2.txt
+++ b/docs/releases/1.7.2.txt
@@ -186,3 +186,6 @@ Bugfixes
* Restored the ability to use more than five levels of subqueries
(:ticket:`23758`).
+
+* Fixed crash when ``ValidationError`` is initialized with a ``ValidationError``
+ that is initialized with a dictionary (:ticket:`24008`).
diff --git a/tests/forms_tests/tests/test_utils.py b/tests/forms_tests/tests/test_utils.py
index f909bb9893..e7d87b8a51 100644
--- a/tests/forms_tests/tests/test_utils.py
+++ b/tests/forms_tests/tests/test_utils.py
@@ -45,9 +45,31 @@ class FormsUtilsTestCase(TestCase):
self.assertHTMLEqual(str(ErrorList(ValidationError(["Error one.", "Error two."]).messages)),
'<ul class="errorlist"><li>Error one.</li><li>Error two.</li></ul>')
+ # Can take a dict.
+ self.assertHTMLEqual(
+ str(ErrorList(sorted(ValidationError({'error_1': "1. Error one.", 'error_2': "2. Error two."}).messages))),
+ '<ul class="errorlist"><li>1. Error one.</li><li>2. Error two.</li></ul>'
+ )
+
# Can take a mixture in a list.
- self.assertHTMLEqual(str(ErrorList(ValidationError(["First error.", "Not \u03C0.", ugettext_lazy("Error.")]).messages)),
- '<ul class="errorlist"><li>First error.</li><li>Not π.</li><li>Error.</li></ul>')
+ self.assertHTMLEqual(
+ str(ErrorList(sorted(ValidationError([
+ "1. First error.",
+ "2. Not \u03C0.",
+ ugettext_lazy("3. Error."),
+ {
+ 'error_1': "4. First dict error.",
+ 'error_2': "5. Second dict error.",
+ },
+ ]).messages))),
+ '<ul class="errorlist">'
+ '<li>1. First error.</li>'
+ '<li>2. Not π.</li>'
+ '<li>3. Error.</li>'
+ '<li>4. First dict error.</li>'
+ '<li>5. Second dict error.</li>'
+ '</ul>'
+ )
@python_2_unicode_compatible
class VeryBadError: