为什么CheckboxInput未被选中时什么也不返回?

时间:2018-09-19 21:10:15

标签: django django-forms

我有一个带有checkbox = forms.BooleanField(required=False)的Django表单,在我看来,我尝试通过以下方式获得该表单:

if request.POST['checkbox'] == True:
    # DO SOMETHING
else:
    # DO SOMETHING ELSE

选中该复选框后,一切正常,但未选中时,返回错误消息MultiValueDictKeyError at /theForm/,并使用if语句突出显示该行。看来,如果未选中该复选框,则即使该元素的Django Documentation也不返回任何内容,也应该返回False

  

标准化为:Python的True或False值。

这怎么做对?我不想使用try: except:函数,因为这不应该引发错误!

BTW:在错误消息的“ POST”部分中,提及其他所有内容(此表单中的其他数据),但复选框字段除外。

1 个答案:

答案 0 :(得分:1)

  

如果未选中该复选框,即使该元素的Django文档说它应该返回False,似乎也不会返回任何内容。

这是正确的,但是在这里您使用Form,而是直接使用POST数据 。 Django的形式对此没有太多控制。尽管Django Form可以在客户端生成表单的HTML,但这些不是 Form。您可以将其视为Django中的概念层,该层有助于构建表单以及解析来自客户端表单的起源的HTTP请求所产生的数据。但是两者之间存在某种“ 阻抗”。

通常,如果未选中 复选框,则名称(和值)为not ship with the POST data。 w3.org将其指定为:

  

复选框(和单选按钮)是可以由用户切换的开/关开关。设置控制元素的选中属性时,开关为“ on”。提交表单后,只有“启用”复选框控件可以成功

在文档中,我们进一步阅读:

  

成功提交的控件对提交是“有效的”。 每个成功的控件都有其控件名称及其当前值,作为提交的表单数据集的一部分。成功的控件必须在FORM元素中定义,并且必须具有控件名称。

因此您可以按以下方式执行检查:

if 'checkbox' in request.POST:
    # DO SOMETHING
else:
    # DO SOMETHING ELSE

或者,更优雅,更安全的方法是让Django表单完成工作,例如:

form = MyForm(request.POST)
if form.is_valid():
    if form.cleaned_data['checkbox']:
        # DO SOMETHING
    else:
        # DO SOMETHING ELSE

在某些情况下,表单可能无效(例如,缺少必填字段,或者某些<select>框包含无效数据等),因此您还必须找到一种处理此类情况的方法。