Loading django/forms/fields.py +5 −6 Original line number Diff line number Diff line Loading @@ -181,17 +181,16 @@ class Field(object): """ Return True if data differs from initial. """ # For purposes of seeing whether something has changed, None is # the same as an empty string, if the data or initial value we get # is None, replace it w/ ''. initial_value = initial if initial is not None else '' try: data = self.to_python(data) if hasattr(self, '_coerce'): data = self._coerce(data) initial_value = self._coerce(initial_value) return self._coerce(data) != self._coerce(initial) except ValidationError: return True # For purposes of seeing whether something has changed, None is # the same as an empty string, if the data or initial value we get # is None, replace it with ''. initial_value = initial if initial is not None else '' data_value = data if data is not None else '' return initial_value != data_value Loading docs/releases/1.9.1.txt +3 −0 Original line number Diff line number Diff line Loading @@ -43,3 +43,6 @@ Bugfixes * Fixed a state bug when using an ``AlterModelManagers`` operation (:ticket:`25852`). * Fixed ``TypedChoiceField`` change detection with nullable fields (:ticket:`25942`). tests/forms_tests/tests/test_fields.py +8 −0 Original line number Diff line number Diff line Loading @@ -1246,6 +1246,14 @@ class FieldsTests(SimpleTestCase): self.assertFalse(f.has_changed(1, '1')) self.assertFalse(f.has_changed('1', '1')) f = TypedChoiceField( choices=[('', '---------'), ('a', "a"), ('b', "b")], coerce=six.text_type, required=False, initial=None, empty_value=None, ) self.assertFalse(f.has_changed(None, '')) self.assertTrue(f.has_changed('', 'a')) self.assertFalse(f.has_changed('a', 'a')) def test_typedchoicefield_special_coerce(self): """ Test a coerce function which results in a value not present in choices. Loading Loading
django/forms/fields.py +5 −6 Original line number Diff line number Diff line Loading @@ -181,17 +181,16 @@ class Field(object): """ Return True if data differs from initial. """ # For purposes of seeing whether something has changed, None is # the same as an empty string, if the data or initial value we get # is None, replace it w/ ''. initial_value = initial if initial is not None else '' try: data = self.to_python(data) if hasattr(self, '_coerce'): data = self._coerce(data) initial_value = self._coerce(initial_value) return self._coerce(data) != self._coerce(initial) except ValidationError: return True # For purposes of seeing whether something has changed, None is # the same as an empty string, if the data or initial value we get # is None, replace it with ''. initial_value = initial if initial is not None else '' data_value = data if data is not None else '' return initial_value != data_value Loading
docs/releases/1.9.1.txt +3 −0 Original line number Diff line number Diff line Loading @@ -43,3 +43,6 @@ Bugfixes * Fixed a state bug when using an ``AlterModelManagers`` operation (:ticket:`25852`). * Fixed ``TypedChoiceField`` change detection with nullable fields (:ticket:`25942`).
tests/forms_tests/tests/test_fields.py +8 −0 Original line number Diff line number Diff line Loading @@ -1246,6 +1246,14 @@ class FieldsTests(SimpleTestCase): self.assertFalse(f.has_changed(1, '1')) self.assertFalse(f.has_changed('1', '1')) f = TypedChoiceField( choices=[('', '---------'), ('a', "a"), ('b', "b")], coerce=six.text_type, required=False, initial=None, empty_value=None, ) self.assertFalse(f.has_changed(None, '')) self.assertTrue(f.has_changed('', 'a')) self.assertFalse(f.has_changed('a', 'a')) def test_typedchoicefield_special_coerce(self): """ Test a coerce function which results in a value not present in choices. Loading