Django Forms BooleanField单元测试用例有什么问题?

2024-10-01 13:37:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我完全被困在这里了。为什么这个测试用例失败?在

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())

它无法通过表单字段验证,,但只有当我更新QueryDict时伪布尔为False时才会失败。如果我说:

^{pr2}$

然后通过验证。这是怎么回事?这是Django表单中的bug吗?在

如果在将QueryDict传递给BogusForm构造函数之前查看它,它看起来像这样:

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

在我看来完全合法和正确。在


Tags: selfformfalse测试用例formsquerydictclass
3条回答

我同意这是不正确的行为。在

这应该适用于特定字段:

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字段都应该这样做:

^{pr2}$

有一种方法可以使这一点变得更好,即不需要布尔字段上的required=False位,但目前不值得这样做。在

从django的documentation

Since all Field subclasses have required=True by default, the validation condition here is important. If you want to include a boolean in your form that can be either True or False (e.g. a checked or unchecked checkbox), you must remember to pass in required=False when creating the BooleanField.

这是因为在默认情况下,您的伪布尔是必填字段。在

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

应该会成功的。在

相关问题 更多 >