Skip to content

Commit bff1ab4

Browse files
committed
Merge remote-tracking branch 'upstream/main'
2 parents 452fdc4 + 38ad710 commit bff1ab4

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

django/forms/models.py

+7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
ImproperlyConfigured,
1212
ValidationError,
1313
)
14+
from django.core.validators import ProhibitNullCharactersValidator
1415
from django.db.models.utils import AltersData
1516
from django.forms.fields import ChoiceField, Field
1617
from django.forms.forms import BaseForm, DeclarativeFieldsMetaclass
@@ -1487,6 +1488,10 @@ def __init__(
14871488
self.limit_choices_to = limit_choices_to # limit the queryset later.
14881489
self.to_field_name = to_field_name
14891490

1491+
def validate_no_null_characters(self, value):
1492+
non_null_character_validator = ProhibitNullCharactersValidator()
1493+
return non_null_character_validator(value)
1494+
14901495
def get_limit_choices_to(self):
14911496
"""
14921497
Return ``limit_choices_to`` for this form field.
@@ -1551,6 +1556,7 @@ def prepare_value(self, value):
15511556
def to_python(self, value):
15521557
if value in self.empty_values:
15531558
return None
1559+
self.validate_no_null_characters(value)
15541560
try:
15551561
key = self.to_field_name or "pk"
15561562
if isinstance(value, self.queryset.model):
@@ -1631,6 +1637,7 @@ def _check_values(self, value):
16311637
code="invalid_list",
16321638
)
16331639
for pk in value:
1640+
self.validate_no_null_characters(pk)
16341641
try:
16351642
self.queryset.filter(**{key: pk})
16361643
except (ValueError, TypeError):

tests/model_forms/test_modelchoicefield.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from django.template import Context, Template
88
from django.test import TestCase
99

10-
from .models import Article, Author, Book, Category, Writer
10+
from .models import Article, Author, Book, Category, ExplicitPK, Writer
1111

1212

1313
class ModelChoiceFieldTests(TestCase):
@@ -79,6 +79,12 @@ def test_clean_to_field_name(self):
7979
self.assertEqual(f.clean(self.c1.slug), self.c1)
8080
self.assertEqual(f.clean(self.c1), self.c1)
8181

82+
def test_model_choice_null_characters(self):
83+
f = forms.ModelChoiceField(queryset=ExplicitPK.objects.all())
84+
msg = "Null characters are not allowed."
85+
with self.assertRaisesMessage(ValidationError, msg):
86+
f.clean("\x00something")
87+
8288
def test_choices(self):
8389
f = forms.ModelChoiceField(
8490
Category.objects.filter(pk=self.c1.id), required=False

tests/model_forms/tests.py

+9
Original file line numberDiff line numberDiff line change
@@ -2227,6 +2227,15 @@ def test_model_multiple_choice_number_of_queries(self):
22272227
f = forms.ModelMultipleChoiceField(queryset=Writer.objects.all())
22282228
self.assertNumQueries(1, f.clean, [p.pk for p in persons[1:11:2]])
22292229

2230+
def test_model_multiple_choice_null_characters(self):
2231+
f = forms.ModelMultipleChoiceField(queryset=ExplicitPK.objects.all())
2232+
msg = "Null characters are not allowed."
2233+
with self.assertRaisesMessage(ValidationError, msg):
2234+
f.clean(["\x00something"])
2235+
2236+
with self.assertRaisesMessage(ValidationError, msg):
2237+
f.clean(["valid", "\x00something"])
2238+
22302239
def test_model_multiple_choice_run_validators(self):
22312240
"""
22322241
ModelMultipleChoiceField run given validators (#14144).

0 commit comments

Comments
 (0)