diff options
| author | Josh Schneier <josh.schneier@gmail.com> | 2017-09-05 12:41:38 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-09-05 16:42:15 -0400 |
| commit | 1d1a56c59983ae40675aff2c737bdde8f988e5e9 (patch) | |
| tree | 0bc7a25e31ad9bcf2b970141a0357b60f8e9a8e0 | |
| parent | 312050df82919cb87180705c826302b7b9b5e367 (diff) | |
[1.11.x] Fixed #28555 -- Made CharField convert whitespace-only values to the empty_value when strip is enabled.
Backport of 48c394a6fc2594891f766293afec8f86d63e1015 from master
| -rw-r--r-- | django/forms/fields.py | 7 | ||||
| -rw-r--r-- | docs/releases/1.11.6.txt | 3 | ||||
| -rw-r--r-- | tests/forms_tests/field_tests/test_charfield.py | 23 |
3 files changed, 29 insertions, 4 deletions
diff --git a/django/forms/fields.py b/django/forms/fields.py index f2b5b77185..734907644a 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -233,11 +233,12 @@ class CharField(Field): def to_python(self, value): "Returns a Unicode object." + if value not in self.empty_values: + value = force_text(value) + if self.strip: + value = value.strip() if value in self.empty_values: return self.empty_value - value = force_text(value) - if self.strip: - value = value.strip() return value def widget_attrs(self, widget): diff --git a/docs/releases/1.11.6.txt b/docs/releases/1.11.6.txt index 4069c8297e..cc8e1bfa59 100644 --- a/docs/releases/1.11.6.txt +++ b/docs/releases/1.11.6.txt @@ -9,4 +9,5 @@ Django 1.11.6 fixes several bugs in 1.11.5. Bugfixes ======== -* ... +* Made the ``CharField`` form field convert whitespace-only values to the + ``empty_value`` when ``strip`` is enabled (:ticket:`28555`). diff --git a/tests/forms_tests/field_tests/test_charfield.py b/tests/forms_tests/field_tests/test_charfield.py index d8fa41b073..aea892ea89 100644 --- a/tests/forms_tests/field_tests/test_charfield.py +++ b/tests/forms_tests/field_tests/test_charfield.py @@ -121,6 +121,29 @@ class CharFieldTest(FormFieldAssertionsMixin, SimpleTestCase): self.assertEqual(f.clean(' 1'), ' 1') self.assertEqual(f.clean('1 '), '1 ') + def test_strip_before_checking_empty(self): + """ + A whitespace-only value, ' ', is stripped to an empty string and then + converted to the empty value, None. + """ + f = CharField(required=False, empty_value=None) + self.assertIsNone(f.clean(' ')) + + def test_clean_non_string(self): + """CharField.clean() calls str(value) before stripping it.""" + class StringWrapper: + def __init__(self, v): + self.v = v + + def __str__(self): + return self.v + + value = StringWrapper(' ') + f1 = CharField(required=False, empty_value=None) + self.assertIsNone(f1.clean(value)) + f2 = CharField(strip=False) + self.assertEqual(f2.clean(value), ' ') + def test_charfield_disabled(self): f = CharField(disabled=True) self.assertWidgetRendersTo(f, '<input type="text" name="f" id="id_f" disabled required />') |
