Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #9609 -- Modified the clean method of(Null)Boolean field to acc…

…ept '1' and '0' as valid inputs. Thanks to psagers for the patch.

This is required to support the use of non-default form widgets such as RadioSelect when the data comes from MySQL, which uses 1/0 to represent booleans.

Merge of r10660 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10662 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 6a21ada37e353a00dc694441fdc0bcf309f0cc4c 1 parent 5a089a5
@freakboy3742 freakboy3742 authored
Showing with 31 additions and 8 deletions.
  1. +9 −8 django/forms/fields.py
  2. +22 −0 tests/regressiontests/forms/fields.py
View
17 django/forms/fields.py
@@ -585,9 +585,10 @@ class BooleanField(Field):
def clean(self, value):
"""Returns a Python boolean object."""
# Explicitly check for the string 'False', which is what a hidden field
- # will submit for False. Because bool("True") == True, we don't need to
- # handle that explicitly.
- if value == 'False':
+ # will submit for False. Also check for '0', since this is what
+ # RadioSelect will provide. Because bool("True") == bool('1') == True,
+ # we don't need to handle that explicitly.
+ if value in ('False', '0'):
value = False
else:
value = bool(value)
@@ -606,13 +607,13 @@ class NullBooleanField(BooleanField):
def clean(self, value):
"""
Explicitly checks for the string 'True' and 'False', which is what a
- hidden field will submit for True and False. Unlike the
- Booleanfield we also need to check for True, because we are not using
- the bool() function
+ hidden field will submit for True and False, and for '1' and '0', which
+ is what a RadioField will submit. Unlike the Booleanfield we need to
+ explicitly check for True, because we are not using the bool() function
"""
- if value in (True, 'True'):
+ if value in (True, 'True', '1'):
return True
- elif value in (False, 'False'):
+ elif value in (False, 'False', '0'):
return False
else:
return None
View
22 tests/regressiontests/forms/fields.py
@@ -1077,6 +1077,10 @@
True
>>> f.clean(0)
False
+>>> f.clean('1')
+True
+>>> f.clean('0')
+False
>>> f.clean('Django rocks')
True
@@ -1201,7 +1205,10 @@
>>> f.clean(False)
False
>>> f.clean(None)
+>>> f.clean('0')
+False
>>> f.clean('1')
+True
>>> f.clean('2')
>>> f.clean('3')
>>> f.clean('hello')
@@ -1220,6 +1227,21 @@
>>> f.cleaned_data['hidden_nullbool2']
False
+# Make sure we're compatible with MySQL, which uses 0 and 1 for its boolean
+# values. (#9609)
+>>> NULLBOOL_CHOICES = (('1', 'Yes'), ('0', 'No'), ('', 'Unknown'))
+>>> class MySQLNullBooleanForm(Form):
+... nullbool0 = NullBooleanField(widget=RadioSelect(choices=NULLBOOL_CHOICES))
+... nullbool1 = NullBooleanField(widget=RadioSelect(choices=NULLBOOL_CHOICES))
+... nullbool2 = NullBooleanField(widget=RadioSelect(choices=NULLBOOL_CHOICES))
+>>> f = MySQLNullBooleanForm({ 'nullbool0': '1', 'nullbool1': '0', 'nullbool2': '' })
+>>> f.full_clean()
+>>> f.cleaned_data['nullbool0']
+True
+>>> f.cleaned_data['nullbool1']
+False
+>>> f.cleaned_data['nullbool2']
+
# MultipleChoiceField #########################################################
>>> f = MultipleChoiceField(choices=[('1', 'One'), ('2', 'Two')])
Please sign in to comment.
Something went wrong with that request. Please try again.