diff options
| author | Claude Paroz <claude@2xlibre.net> | 2015-12-16 23:07:17 +0100 |
|---|---|---|
| committer | Claude Paroz <claude@2xlibre.net> | 2015-12-17 15:39:34 +0100 |
| commit | ff077cd6496b6f82195e2dc040f70e19e7c206c9 (patch) | |
| tree | 526db2a2df95513350e9daf3bc523f00fdefb1ee | |
| parent | 54295a95d9b34dadb17054b88d43b2b769ccc0f3 (diff) | |
[1.9.x] Fixed #25942 -- Fixed TypedChoiceField.has_changed with nullable field
This fixes a regression introduced by 871440361.
Backport of d91cc25a2a from master.
| -rw-r--r-- | django/forms/fields.py | 11 | ||||
| -rw-r--r-- | docs/releases/1.9.1.txt | 3 | ||||
| -rw-r--r-- | tests/forms_tests/tests/test_fields.py | 8 |
3 files changed, 16 insertions, 6 deletions
diff --git a/django/forms/fields.py b/django/forms/fields.py index 85e7219cd4..d2ae133486 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -191,17 +191,16 @@ class Field(six.with_metaclass(RenameFieldMethods, 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 diff --git a/docs/releases/1.9.1.txt b/docs/releases/1.9.1.txt index 25acbd540b..20fd723d2b 100644 --- a/docs/releases/1.9.1.txt +++ b/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`). diff --git a/tests/forms_tests/tests/test_fields.py b/tests/forms_tests/tests/test_fields.py index 9606246bf6..491756db70 100644 --- a/tests/forms_tests/tests/test_fields.py +++ b/tests/forms_tests/tests/test_fields.py @@ -1257,6 +1257,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. |
