Loading django/forms/fields.py +5 −1 Original line number Diff line number Diff line Loading @@ -1104,7 +1104,11 @@ class MultiValueField(Field): if not isinstance(initial, list): initial = self.widget.decompress(initial) for field, initial, data in zip(self.fields, initial, data): if field.has_changed(field.to_python(initial), data): try: initial = field.to_python(initial) except ValidationError: return True if field.has_changed(initial, data): return True return False Loading docs/releases/1.7.2.txt +2 −0 Original line number Diff line number Diff line Loading @@ -119,3 +119,5 @@ Bugfixes * Fixed bug in ``makemigrations`` that created broken migration files when dealing with multiple table inheritance and inheriting from more than one model (:ticket:`23956`). * Fixed a crash when a ``MultiValueField`` has invalid data (:ticket:`23674`). tests/forms_tests/tests/test_forms.py +16 −0 Original line number Diff line number Diff line Loading @@ -2006,6 +2006,22 @@ class FormsTestCase(TestCase): self.assertIsNot(field2.fields, field.fields) self.assertIsNot(field2.fields[0].choices, field.fields[0].choices) def test_multivalue_initial_data(self): """ #23674 -- invalid initial data should not break form.changed_data() """ class DateAgeField(MultiValueField): def __init__(self, fields=(), *args, **kwargs): fields = (DateField(label="Date"), IntegerField(label="Age")) super(DateAgeField, self).__init__(fields=fields, *args, **kwargs) class DateAgeForm(Form): date_age = DateAgeField() data = {"date_age": ["1998-12-06", 16]} form = DateAgeForm(data, initial={"date_age": ["200-10-10", 14]}) self.assertTrue(form.has_changed()) def test_multivalue_optional_subfields(self): class PhoneField(MultiValueField): def __init__(self, *args, **kwargs): Loading Loading
django/forms/fields.py +5 −1 Original line number Diff line number Diff line Loading @@ -1104,7 +1104,11 @@ class MultiValueField(Field): if not isinstance(initial, list): initial = self.widget.decompress(initial) for field, initial, data in zip(self.fields, initial, data): if field.has_changed(field.to_python(initial), data): try: initial = field.to_python(initial) except ValidationError: return True if field.has_changed(initial, data): return True return False Loading
docs/releases/1.7.2.txt +2 −0 Original line number Diff line number Diff line Loading @@ -119,3 +119,5 @@ Bugfixes * Fixed bug in ``makemigrations`` that created broken migration files when dealing with multiple table inheritance and inheriting from more than one model (:ticket:`23956`). * Fixed a crash when a ``MultiValueField`` has invalid data (:ticket:`23674`).
tests/forms_tests/tests/test_forms.py +16 −0 Original line number Diff line number Diff line Loading @@ -2006,6 +2006,22 @@ class FormsTestCase(TestCase): self.assertIsNot(field2.fields, field.fields) self.assertIsNot(field2.fields[0].choices, field.fields[0].choices) def test_multivalue_initial_data(self): """ #23674 -- invalid initial data should not break form.changed_data() """ class DateAgeField(MultiValueField): def __init__(self, fields=(), *args, **kwargs): fields = (DateField(label="Date"), IntegerField(label="Age")) super(DateAgeField, self).__init__(fields=fields, *args, **kwargs) class DateAgeForm(Form): date_age = DateAgeField() data = {"date_age": ["1998-12-06", 16]} form = DateAgeForm(data, initial={"date_age": ["200-10-10", 14]}) self.assertTrue(form.has_changed()) def test_multivalue_optional_subfields(self): class PhoneField(MultiValueField): def __init__(self, *args, **kwargs): Loading