summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Schneier <josh.schneier@gmail.com>2017-09-05 12:41:38 -0400
committerTim Graham <timograham@gmail.com>2017-09-05 16:42:15 -0400
commit1d1a56c59983ae40675aff2c737bdde8f988e5e9 (patch)
tree0bc7a25e31ad9bcf2b970141a0357b60f8e9a8e0
parent312050df82919cb87180705c826302b7b9b5e367 (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.py7
-rw-r--r--docs/releases/1.11.6.txt3
-rw-r--r--tests/forms_tests/field_tests/test_charfield.py23
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 />')