浏览代码

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

This fixes a regression introduced by 871440361.
Claude Paroz 9 年之前
父节点
当前提交
d91cc25a2a
共有 3 个文件被更改,包括 16 次插入6 次删除
  1. 5 6
      django/forms/fields.py
  2. 3 0
      docs/releases/1.9.1.txt
  3. 8 0
      tests/forms_tests/tests/test_fields.py

+ 5 - 6
django/forms/fields.py

@@ -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
docs/releases/1.9.1.txt

@@ -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
tests/forms_tests/tests/test_fields.py

@@ -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.