【问题标题】:Django: detect whether checkbox is submitted or disabledDjango:检测复选框是提交还是禁用
【发布时间】:2012-04-19 14:24:38
【问题描述】:

在 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 不包含未提交字段的键。如何检测是否未提交,而不是未选中提交?

【问题讨论】:

    标签: django checkbox django-forms disabled-input


    【解决方案1】:

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

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

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

    【讨论】:

    • 首先,你对代码的意图是正确的,我已经改变了一些事情来响应第一个模型的布尔字段的状态,而不是第二个模型中相关对象的存在.所以谢谢你的推动。关于提交数据的问题,您是说表单的cleaned_data 将包含一个键,但禁用的复选框没有值?
    • 否:cleaned_data 将包含False 作为复选框的键,无论它是禁用还是未选中。
    猜你喜欢
    • 2013-09-29
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2015-02-09
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多