What is wrong with the Django Forms BooleanField unit test?

I am completely stuck here. Why does this test fail?

class BogusForm(forms.Form):
    bogus_bool = forms.BooleanField() 

class TestBogusForm(TestCase):

    def test_bogus_false(self):
        query_dict = QueryDict('', mutable=True)
        query_dict.update({'bogus_bool': False})
        bogus_form = BogusForm(query_dict)
        self.assertTrue(bogus_form.is_valid())

Verification of the form field failed , but only if bogus_bool is False when updating QueryDict . If I say:

query_dict.update({'bogus_bool': True})

Then he passes the test. What's going on here? Is this a bug in Django Forms?

If I look at QueryDict before passing it to the BogusForm constructor, it looks like this:

<QueryDict: {u'bogus_bool': [False]}>

Which looks completely legal and right for me.

+3
source share
3 answers

From django documentation

value = True, . boolean , True, False (, ), , value = False BooleanField.

+2

, .

:

class BogusForm(forms.Form):
    bogus_bool = forms.BooleanField(required=False)

    def clean_bogus_bool(self):
        field_name = 'bogus_bool'
        if field_name not in self.data:
            raise forms.ValidationError("This field is required.")
        return self.cleaned_data[field_name]


bool :

class BooleanFieldsRequiredMixin(forms.Form):
    def clean(self):
        for field_name, field in self.fields.iteritems():
            # Only BooleanField not subclasses of it.
            if type(field) is not forms.BooleanField:
                continue

            if field_name not in self.data:
                self._errors[field_name] = self.error_class(["This field is required."])

        return super(BooleanFieldsRequiredMixin, self).clean()


class BogusForm(BooleanFieldsRequiredMixin, forms.Form):
    bogus_bool = forms.BooleanField(required=False)

, required=False , .

+2

This is because your bogus_bool is required by default.

class BogusForm(forms.Form):
    bogus_bool = forms.BooleanField(required=False)

gotta do the trick.

0
source

All Articles