From f32d24652b920135eb6a0f3de74599f03e181731 Mon Sep 17 00:00:00 2001 From: Windson yang Date: Tue, 25 Jul 2017 06:55:41 +0800 Subject: [PATCH] Fixed #28321 -- Prevented FormSet.full_clean() from adding errors from deleted forms. --- django/forms/formsets.py | 8 ++++++-- tests/forms_tests/tests/test_formsets.py | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/django/forms/formsets.py b/django/forms/formsets.py index 1c55d5f6df..7332e4b2f4 100644 --- a/django/forms/formsets.py +++ b/django/forms/formsets.py @@ -324,8 +324,12 @@ class BaseFormSet: # Empty forms are unchanged forms beyond those with initial data. if not form.has_changed() and i >= self.initial_form_count(): empty_forms_count += 1 - - self._errors.append(form.errors) + # Accessing errors calls full_clean() if necessary. + # _should_delete_form() requires cleaned_data. + form_errors = form.errors + if self.can_delete and self._should_delete_form(form): + continue + self._errors.append(form_errors) try: if (self.validate_max and self.total_form_count() - len(self.deleted_forms) > self.max_num) or \ diff --git a/tests/forms_tests/tests/test_formsets.py b/tests/forms_tests/tests/test_formsets.py index c1dc8e8560..29f138b2d1 100644 --- a/tests/forms_tests/tests/test_formsets.py +++ b/tests/forms_tests/tests/test_formsets.py @@ -597,6 +597,7 @@ class FormsFormsetTestCase(SimpleTestCase): 'form-MIN_NUM_FORMS': 0, 'form-MAX_NUM_FORMS': 1}) self.assertTrue(p.is_valid()) + self.assertEqual(p._errors, []) self.assertEqual(len(p.deleted_forms), 1) def test_formsets_with_ordering(self):