From 26f8929f16c514bd9967cd78d8dcd7760b82cc92 Mon Sep 17 00:00:00 2001 From: afenoum Date: Sun, 15 Mar 2026 14:18:59 +0300 Subject: [PATCH 1/2] Fixed #36913 -- Optimized MultipleChoiceField.validate(). --- AUTHORS | 1 + django/forms/fields.py | 3 ++- .../field_tests/test_multiplechoicefield.py | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 9379176a4c0d..bea9d3fd4de5 100644 --- a/AUTHORS +++ b/AUTHORS @@ -35,6 +35,7 @@ answer newbie questions, and generally made Django that much better: Ahmad Al-Ibrahim Ahmed Eltawela Ahmed Nassar + Aina Anjary Fenomamy R. ajs Akash Agrawal Akash Kumar Sen diff --git a/django/forms/fields.py b/django/forms/fields.py index 6408be2f060c..7f978aa03d62 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -965,7 +965,8 @@ def validate(self, value): if self.required and not value: raise ValidationError(self.error_messages["required"], code="required") # Validate that each value in the value list is in self.choices. - for val in value: + # Use set() to avoid redundant validation. + for val in set(value): if not self.valid_value(val): raise ValidationError( self.error_messages["invalid_choice"], diff --git a/tests/forms_tests/field_tests/test_multiplechoicefield.py b/tests/forms_tests/field_tests/test_multiplechoicefield.py index f316e1de8ed5..90a47ceee021 100644 --- a/tests/forms_tests/field_tests/test_multiplechoicefield.py +++ b/tests/forms_tests/field_tests/test_multiplechoicefield.py @@ -76,3 +76,20 @@ def test_multiplechoicefield_changed(self): def test_disabled_has_changed(self): f = MultipleChoiceField(choices=[("1", "One"), ("2", "Two")], disabled=True) self.assertIs(f.has_changed("x", "y"), False) + + def test_validate_duplicated_values(self): + f = MultipleChoiceField( + choices=[ + ("1", "One"), + ("2", "Two"), + ("3", "Three"), + ("4", "Four"), + ("5", "Five"), + ] + ) + self.assertIsNone(f.validate(["4", "4", "5", "5"])) + + def test_validate_duplicated_invalid_values(self): + f = MultipleChoiceField(choices=[("1", "one"), ("2", "Two")]) + with self.assertRaises(ValidationError): + f.validate(["1", "1", "invalid", "invalid"]) From f6167b8bc881babd19b67c004e8f37954afc192e Mon Sep 17 00:00:00 2001 From: JaeHyuckSa Date: Thu, 26 Mar 2026 00:25:07 +0900 Subject: [PATCH 2/2] Fixed #36993 -- Clarified N/A usage in pull request template for typo fixes. Signed-off-by: JaeHyuckSa --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c78347672a38..446c6b37e3ef 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,6 +1,6 @@ #### Trac ticket number - + ticket-XXXXX