Commit abcf1cb3 authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

Fixed #5957 -- Enforce the "required" attribute on BooleanField in newforms.

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: http://code.djangoproject.com/svn/django/trunk@7799 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 8e816c83
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -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):
    """
+9 −3
Original line number Diff line number Diff line
@@ -937,18 +937,24 @@ ValidationError: [u'This field is required.']
>>> f.clean(True)
True
>>> f.clean(False)
False
Traceback (most recent call last):
...
ValidationError: [u'This field is required.']
>>> f.clean(1)
True
>>> f.clean(0)
False
Traceback (most recent call last):
...
ValidationError: [u'This field is required.']
>>> f.clean('Django rocks')
True

>>> f.clean('True')
True
>>> f.clean('False')
False
Traceback (most recent call last):
...
ValidationError: [u'This field is required.']

>>> f = BooleanField(required=False)
>>> f.clean('')