Skip to content

Commit 0dea81c

Browse files
Grzegorz Slusarektimgraham
Grzegorz Slusarek
authored andcommitted
Fixed #23674 -- Fixed a crash when a MultiValueField has invalid data.
1 parent 43041ee commit 0dea81c

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

django/forms/fields.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1104,7 +1104,11 @@ def has_changed(self, initial, data):
11041104
if not isinstance(initial, list):
11051105
initial = self.widget.decompress(initial)
11061106
for field, initial, data in zip(self.fields, initial, data):
1107-
if field.has_changed(field.to_python(initial), data):
1107+
try:
1108+
initial = field.to_python(initial)
1109+
except ValidationError:
1110+
return True
1111+
if field.has_changed(initial, data):
11081112
return True
11091113
return False
11101114

docs/releases/1.7.2.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,5 @@ Bugfixes
119119
* Fixed bug in ``makemigrations`` that created broken migration files when
120120
dealing with multiple table inheritance and inheriting from more than one
121121
model (:ticket:`23956`).
122+
123+
* Fixed a crash when a ``MultiValueField`` has invalid data (:ticket:`23674`).

tests/forms_tests/tests/test_forms.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2006,6 +2006,22 @@ def __init__(self, fields=(), *args, **kwargs):
20062006
self.assertIsNot(field2.fields, field.fields)
20072007
self.assertIsNot(field2.fields[0].choices, field.fields[0].choices)
20082008

2009+
def test_multivalue_initial_data(self):
2010+
"""
2011+
#23674 -- invalid initial data should not break form.changed_data()
2012+
"""
2013+
class DateAgeField(MultiValueField):
2014+
def __init__(self, fields=(), *args, **kwargs):
2015+
fields = (DateField(label="Date"), IntegerField(label="Age"))
2016+
super(DateAgeField, self).__init__(fields=fields, *args, **kwargs)
2017+
2018+
class DateAgeForm(Form):
2019+
date_age = DateAgeField()
2020+
2021+
data = {"date_age": ["1998-12-06", 16]}
2022+
form = DateAgeForm(data, initial={"date_age": ["200-10-10", 14]})
2023+
self.assertTrue(form.has_changed())
2024+
20092025
def test_multivalue_optional_subfields(self):
20102026
class PhoneField(MultiValueField):
20112027
def __init__(self, *args, **kwargs):

0 commit comments

Comments
 (0)