Skip to content
Browse files

Fixed #5957 -- Enforce the "required" attribute on BooleanField in ne…


This has been the documented behaviour for ages, but it wasn't correctly
implemented. A required BooleanField must be True/checked, since False values
aren't submitted. Ideal for things like "terms of service" agreements.

Backwards incompatible (since required=True is the default for all fields).

Unclear who the original patch was from, but Tai Lee and Alex have kept it up
to date recently.

git-svn-id: bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
1 parent 8e816c8 commit abcf1cb36d0bf22d5f2efa4dd85183a0341b33f8 @malcolmt malcolmt committed
Showing with 16 additions and 6 deletions.
  1. +7 −3 django/newforms/
  2. +9 −3 tests/regressiontests/forms/
10 django/newforms/
@@ -535,13 +535,17 @@ class BooleanField(Field):
def clean(self, value):
"""Returns a Python boolean object."""
- super(BooleanField, self).clean(value)
# 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':
- return False
- return bool(value)
+ value = False
+ else:
+ value = bool(value)
+ super(BooleanField, self).clean(value)
+ if not value and self.required:
+ raise ValidationError(self.error_messages['required'])
+ return value
class NullBooleanField(BooleanField):
12 tests/regressiontests/forms/
@@ -937,18 +937,24 @@
>>> f.clean(True)
>>> f.clean(False)
+Traceback (most recent call last):
+ValidationError: [u'This field is required.']
>>> f.clean(1)
>>> f.clean(0)
+Traceback (most recent call last):
+ValidationError: [u'This field is required.']
>>> f.clean('Django rocks')
>>> f.clean('True')
>>> f.clean('False')
+Traceback (most recent call last):
+ValidationError: [u'This field is required.']
>>> f = BooleanField(required=False)
>>> f.clean('')

0 comments on commit abcf1cb

Please sign in to comment.
Something went wrong with that request. Please try again.