From 0ebea6e5c07485a36862e9b6e2be18d1694ad2c5 Mon Sep 17 00:00:00 2001 From: Clifford Gama Date: Sat, 8 Mar 2025 15:46:58 +0200 Subject: Fixed #35676 -- Made BaseModelForm validate constraints that reference an InlineForeignKeyField. Co-authored-by: Simon Charette --- tests/inline_formsets/models.py | 5 +++++ tests/inline_formsets/tests.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) (limited to 'tests/inline_formsets') diff --git a/tests/inline_formsets/models.py b/tests/inline_formsets/models.py index f4c06e8fac..a090387c42 100644 --- a/tests/inline_formsets/models.py +++ b/tests/inline_formsets/models.py @@ -15,6 +15,11 @@ class Child(models.Model): school = models.ForeignKey(School, models.CASCADE) name = models.CharField(max_length=100) + class Meta: + constraints = [ + models.UniqueConstraint("mother", "father", name="unique_parents"), + ] + class Poet(models.Model): name = models.CharField(max_length=100) diff --git a/tests/inline_formsets/tests.py b/tests/inline_formsets/tests.py index 1ae9b3f760..0fe9766dc6 100644 --- a/tests/inline_formsets/tests.py +++ b/tests/inline_formsets/tests.py @@ -215,3 +215,38 @@ class InlineFormsetFactoryTest(TestCase): ) formset = PoemFormSet(None, instance=poet) formset.forms # Trigger form instantiation to run the assert above. + + +class InlineFormsetConstraintsValidationTests(TestCase): + def test_constraint_refs_inline_foreignkey_field(self): + """ + Constraints that reference an InlineForeignKeyField should not be + skipped from validation (#35676). + """ + ChildFormSet = inlineformset_factory( + Parent, + Child, + fk_name="mother", + fields="__all__", + extra=1, + ) + father = Parent.objects.create(name="James") + school = School.objects.create(name="Hogwarts") + mother = Parent.objects.create(name="Lily") + Child.objects.create(name="Harry", father=father, mother=mother, school=school) + data = { + "mothers_children-TOTAL_FORMS": "1", + "mothers_children-INITIAL_FORMS": "0", + "mothers_children-MIN_NUM_FORMS": "0", + "mothers_children-MAX_NUM_FORMS": "1000", + "mothers_children-0-id": "", + "mothers_children-0-father": str(father.pk), + "mothers_children-0-school": str(school.pk), + "mothers_children-0-name": "Mary", + } + formset = ChildFormSet(instance=mother, data=data, queryset=None) + self.assertFalse(formset.is_valid()) + self.assertEqual( + formset.errors, + [{"__all__": ["Constraint “unique_parents” is violated."]}], + ) -- cgit v1.3