我有一个带有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”部分中,提及其他所有内容(此表单中的其他数据),但复选框字段除外。
答案 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>
框包含无效数据等),因此您还必须找到一种处理此类情况的方法。