我有一个使用以下形式的应用程序:
class ConfirmForm(forms.Form):
account_name = forms.CharField(widget=forms.HiddenInput)
up_to_date = forms.BooleanField(initial=True)
我使用以下模板摘录中的表单:
<form class="confirmform" action="/foo/" enctype="multipart/form-data" method="post">
{{ confirm_form.up_to_date }} Check if this data brings the account up to date.<br>
{{ confirm_form.account_name }} <input type="submit" name="confirm" value="Confirm" />
</form>
我的 View 使用以下基本代码结构:
if request.method == 'POST':
#check for 'confirm' because I actually have multiple forms in this page
if 'confirm' in request.POST:
confirm_form = ConfirmForm(request.POST)
if confirm_form.is_valid():
#do stuff
else:
c['confirm_form'] = confirm_form
else:
c['confirm_form'] = ConfirmForm({'account_name':'provided_value'})
有两点是错误的:
1) 即使我设置了 initial=True,页面加载时该复选框仍未选中
2) 除非我选中复选框,否则表单总是无效的。它仅给出 up_to_date 的错误:“此字段是必需的。”
我已阅读 this similar question但他的解决方案不适用于我的项目。
那么……这是怎么回事?
编辑:
我更新了上面的代码以更忠实于我的实际代码。
问题 #1 是我的错,因为我在实例化表单时通过绑定(bind)数据覆盖了初始值。
问题#2 我还在考虑一个问题。在 up_to_date
上使用 required=False
将解决问题,但是使用默认小部件似乎不正确,BooleanField
可以是NULL
(导致有效性检查失败)或 True
但永远不会 False
。
最佳答案
在 Django 表单中, bool 字段必须使用 required=False
创建。
当复选框未选中时,浏览器不会在请求的 POST 参数中发送该字段。如果不指定该字段是可选的,当它不在 POST 参数中时,Django 会将其视为缺失字段。
恕我直言,如果 Django 对 bool 表单字段默认具有此行为就好了。
(Yuji 已经在评论中回答了这个问题,但作为答案会很有用)
关于除非经过检查,否则带有 BooleanField 的 Django 表单总是无效的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8542839/