From c490e410af086fa89f40d515505bba02a08168f3 Mon Sep 17 00:00:00 2001 From: Marc Tamlyn Date: Fri, 20 Feb 2015 11:33:02 +0000 Subject: [PATCH] Fixed #24373 -- Added run_validators to ArrayField. Thanks to DavidMuller for the report. --- django/contrib/postgres/fields/array.py | 12 ++++++++++++ tests/postgres_tests/test_array.py | 10 +++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/django/contrib/postgres/fields/array.py b/django/contrib/postgres/fields/array.py index 8e442c4a7ac..970355fd622 100644 --- a/django/contrib/postgres/fields/array.py +++ b/django/contrib/postgres/fields/array.py @@ -139,6 +139,18 @@ class ArrayField(Field): code='nested_array_mismatch', ) + def run_validators(self, value): + super(ArrayField, self).run_validators(value) + for i, part in enumerate(value): + try: + self.base_field.run_validators(part) + except exceptions.ValidationError as e: + raise exceptions.ValidationError( + string_concat(self.error_messages['item_invalid'], ' '.join(e.messages)), + code='item_invalid', + params={'nth': i}, + ) + def formfield(self, **kwargs): defaults = { 'form_class': SimpleArrayField, diff --git a/tests/postgres_tests/test_array.py b/tests/postgres_tests/test_array.py index 88e34f9ce40..35a3bffd584 100644 --- a/tests/postgres_tests/test_array.py +++ b/tests/postgres_tests/test_array.py @@ -6,7 +6,7 @@ import uuid from django import forms from django.contrib.postgres.fields import ArrayField from django.contrib.postgres.forms import SimpleArrayField, SplitArrayField -from django.core import exceptions, serializers +from django.core import exceptions, serializers, validators from django.core.management import call_command from django.db import IntegrityError, connection, models from django.test import TestCase, TransactionTestCase, override_settings @@ -330,6 +330,14 @@ class TestValidation(TestCase): self.assertEqual(cm.exception.code, 'nested_array_mismatch') self.assertEqual(cm.exception.messages[0], 'Nested arrays must have the same length.') + def test_with_validators(self): + field = ArrayField(models.IntegerField(validators=[validators.MinValueValidator(1)])) + field.clean([1, 2], None) + with self.assertRaises(exceptions.ValidationError) as cm: + field.clean([0], None) + self.assertEqual(cm.exception.code, 'item_invalid') + self.assertEqual(cm.exception.messages[0], 'Item 0 in the array did not validate: Ensure this value is greater than or equal to 1.') + class TestSimpleFormField(TestCase):