Commit d91cc25a authored by Claude Paroz's avatar Claude Paroz
Browse files

Fixed #25942 -- Fixed TypedChoiceField.has_changed with nullable field

This fixes a regression introduced by 87144036.
parent 2ec23a3d
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -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

+3 −0
Original line number Diff line number Diff line
@@ -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`).
+8 −0
Original line number Diff line number Diff line
@@ -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.