除非经过检查,否则带有 BooleanField 的 Django 表单总是无效的

标签 django django-forms

我有一个使用以下形式的应用程序:

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/

相关文章:

Django - 无法获取 Highcharts 来显示数据

Django - 具有自动完成功能的 Javascript 动态内联 FormSet

python - Django SelectDateWidget 未正确渲染

python - Django 表格 : Make some text sent by form to email appear bold

django - 覆盖 Django 1.6 中的 ModelForm 字段错误消息

django 注册 : what's the up-to date 'canonical' way to extend 'contrib.auth.models.User'

python - Django 和 PostgreSQL 事务的默认隔离级别 (@atomic)

python - Django 中 "}"的来源(当前路径,entries/},与其中任何一个都不匹配。)

django - 从 GET 字典中删除值并重定向到新 URL

python - 如何为 class.DeleteView 创建确认弹出窗口