我有一个简单的HTML表单,正在尝试使用Django表单进行验证。问题在于,Django的表单验证将仅识别is_kit
的值'True'
。 (当它为'False'
时,将显示一条错误消息,指出必须填写该字段。格式如下:
<form method="post"> {% csrf_token %}
<input type="hidden" name="part_id" value="{{ part.id }}" />
<input type="hidden" name="is_kit" value="False" />
<input type="submit" class="btn btn-link" value="Add to Cart"/>
</form>
这是Django表单:
class AddItemToCartForm(forms.Form):
part_id = forms.IntegerField()
is_kit = forms.BooleanField()
这是我观点的相关部分:
def post(self, request, id):
print(request.POST)
print(request.POST.get('is_kit'))
form = AddItemToCartForm(request.POST)
print(form.errors)
服务器提供的输出在这里:
<QueryDict: {'is_kit': ['False'], 'part_id': ['1'], 'csrfmiddlewaretoken': ['X2vkpwG6GJmK79vypFPAveTzVkrxBauJWgfnRvAtJVcZ8NwBokjQhCnfGN9dFFYF']}>
False
<ul class="errorlist"><li>is_kit<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
我认为我的模板应该可以工作,因为查看the source code,forms.BooleanField
会将POST数据中的字符串'False'
转换为python False
值。
如上所述,如果is_kit
设置为'True'
,则表单可以完美验证。
答案 0 :(得分:1)
由于默认情况下所有Field子类都具有
required=True
,因此此处的验证条件很重要。如果要在表单中包含布尔值,可以是True
或False
(例如,选中或未选中的复选框),则必须记住传递required=False
BooleanField
时创建strong>。
因此,在 required=False
中将 BooleanField()
添加为
class AddItemToCartForm(forms.Form):
part_id = forms.IntegerField()
is_kit = forms.BooleanField(required=False)
其他信息:
如果未选中此复选框,则浏览器不会在请求的POST参数中发送该字段。如果不指定该字段为可选字段,则Django将不在POST参数中时将其视为缺少的字段。
参考:SO Post
答案 1 :(得分:0)
您需要将required=False
添加到您的BooleanField
:
class AddItemToCartForm(forms.Form):
part_id = forms.IntegerField()
is_kit = forms.BooleanField(required=False)