0

在 django 中,我有代码可以动态禁用复选框,因为取消选中它会触发一些对象删除。如果我的对象不应该被删除,复选框会被禁用,并且不会被提交。

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

表格.py

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

视图.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 不包含未提交字段的键。我如何检测它是否未提交,而不是未检查提交?

4

1 回答 1

4

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

如果您真的需要区分这些状态,您将需要一个不同的控件:可能是一组用于is_userwithtruefalsevalues 的单选按钮。或者,如果您绝对必须有一个复选框,也许您可​​以使用一些 Javascript 在未选中时设置隐藏控件。

无论如何,除非勾选复选框,否则删除代码绝对是错误的方法。操作应始终默认为破坏性最小:执行删除之类的操作需要积极的操作。

于 2012-04-05T21:10:20.957 回答