Django出现“'on'值必须为True或False”错误的解决求助
解决Django中"'on' value must be either True or False."错误
错误原因分析
嘿,问题根源很明确——你直接从request.POST里拿复选框的值,可浏览器提交选中的复选框时,传的是字符串'on',而Django模型里的BooleanField字段只认True/False这种布尔类型,把字符串塞进去自然就触发报错了。另外如果用户没勾选复选框,request.POST里甚至不会有checkbox这个键,直接用request.POST['checkbox']还会触发KeyError。
解决方案
1. 利用表单cleaned_data获取正确布尔值
表单通过is_valid()验证后,会自动把表单数据转换成对应的数据类型,直接从form.cleaned_data里取值就能拿到现成的布尔值,还能避免未勾选时的键不存在问题。
修改views.py里的sign_list函数:
def sign_list(request): if request.method == 'POST': form = sign(request.POST) if form.is_valid(): cleaned_data = form.cleaned_data new_contact = Comment( email=cleaned_data['email'], message=cleaned_data['message'], checkbox=cleaned_data.get('checkbox', False) # 未勾选时默认设为False ) new_contact.save() return redirect('index') else: form = sign() context = {'form' : form} return render(request, 'submits/sign.html', context)
2.(可选)修复表单复选框属性的小问题
你的forms.py里定义了checkbox_attributes但没实际用上,应该把样式属性直接绑定到复选框的widget上:
class sign(forms.Form): email = forms.CharField(max_length=500, widget=forms.TextInput(attrs={ 'type' : 'email', 'class' : 'form-control', 'placeholder' : 'Enter your email', 'aria-describedby' : 'emailHelp'})) message = forms.CharField(widget=forms.Textarea(attrs={ 'class' : 'form-control', 'rows' : '3', 'placeholder' : 'Write your proposal'})) checkbox = forms.BooleanField( required=False, initial=True, widget=forms.CheckboxInput(attrs={'class': 'form-check'}) )
备选方案:手动判断复选框状态
如果不想用cleaned_data,也可以手动判断request.POST里是否存在checkbox键——存在就代表用户勾选了(对应True),不存在就是未勾选(对应False):
# 替换视图里的checkbox赋值逻辑 checkbox = 'checkbox' in request.POST new_contact = Comment( email=request.POST['email'], message=request.POST['message'], checkbox=checkbox )
按上面的方法修改后,就能正确把复选框状态转换成布尔值存入数据库,这个错误就彻底解决啦!
内容的提问来源于stack exchange,提问作者João Maria
相关产品推荐
相关产品推荐

