1
0
mirror of https://github.com/django/django.git synced 2025-10-23 21:59:11 +00:00

Fixed #35676 -- Made BaseModelForm validate constraints that reference an InlineForeignKeyField.

Co-authored-by: Simon Charette <charette.s@gmail.com>
This commit is contained in:
Clifford Gama
2025-03-08 15:46:58 +02:00
committed by Sarah Boyce
parent 5183f7c287
commit 0ebea6e5c0
7 changed files with 135 additions and 13 deletions

View File

@@ -40,6 +40,7 @@ from .models import (
Character,
Colour,
ColourfulItem,
ConstraintsModel,
CustomErrorMessage,
CustomFF,
CustomFieldForExclusionModel,
@@ -3718,3 +3719,40 @@ class ModelToDictTests(TestCase):
# If data were a QuerySet, it would be reevaluated here and give "red"
# instead of the original value.
self.assertEqual(data, [blue])
class ConstraintValidationTests(TestCase):
def test_unique_constraint_refs_excluded_field(self):
obj = ConstraintsModel.objects.create(name="product", price="1.00")
data = {
"id": "",
"name": obj.name,
"price": "1337.00",
"category": obj.category,
}
ConstraintsModelForm = modelform_factory(ConstraintsModel, fields="__all__")
ExcludeCategoryForm = modelform_factory(ConstraintsModel, exclude=["category"])
full_form = ConstraintsModelForm(data)
exclude_category_form = ExcludeCategoryForm(data)
self.assertTrue(exclude_category_form.is_valid())
self.assertFalse(full_form.is_valid())
self.assertEqual(
full_form.errors, {"__all__": ["This product already exists."]}
)
def test_check_constraint_refs_excluded_field(self):
data = {
"id": "",
"name": "priceless",
"price": "0.00",
"category": "category 1",
}
ConstraintsModelForm = modelform_factory(ConstraintsModel, fields="__all__")
ExcludePriceForm = modelform_factory(ConstraintsModel, exclude=["price"])
full_form = ConstraintsModelForm(data)
exclude_price_form = ExcludePriceForm(data)
self.assertTrue(exclude_price_form.is_valid())
self.assertFalse(full_form.is_valid())
self.assertEqual(
full_form.errors, {"__all__": ["Price must be greater than zero."]}
)