Django:检测是否提交了复选框

时间:2012-04-05 20:26:33

标签: django checkbox django-forms disabled-input

在django中,我有动态禁用复选框的代码,因为取消选中它会触发一些对象删除。如果不应删除我的对象,则复选框将显示为已禁用,并且未提交。

但是,在视图中,我无法区分提交的复选框为false和未提交的复选框,因为form.cleaned_data仍包含密钥“is_user”。

forms.py

if somecondition:
    self.fields["is_user"].widget.attrs['disabled'] = True

views.py

if "is_user" in form.cleaned_data:
    if form.cleaned_data["is_user"] == False:
        do dangerous deleting
        return redirect(page)
    elif form.cleaned_data["is_user"] == True:
        process information
        return redirect(page)
else:
    return redirect(page)

我从复选框禁用状态提交表单,在pdb shell中我可以输入:

(pdb) form.cleaned_data
{'is_user': False}

我原本以为form.cleaned_data不包含非提交字段的密钥。我如何检测它是否未提交,而不是提交未选中?

1 个答案:

答案 0 :(得分:4)

未选中的复选框与未提交的复选框之间的HTML没有区别。简而言之,如果您取消选中一个复选框,它就不会包含在POST中。这与Django无关,而是浏览器的工作方式。

如果您确实需要区分这些状态,则需要一个不同的控件:可能是is_user的一组带有truefalse值的单选按钮。或者,如果你必须有一个复选框,也许你可以使用一些Javascript在未选中时设置一个隐藏的控件。

在任何情况下,拥有删除的代码,除非选中一个复选框,这绝对是错误的方法。操作应始终默认为破坏性最小:执行删除等操作需要采取积极行动。