首页 > 解决方案 > 表单中的 django 布尔值始终返回 true

问题描述

学习 django,并尝试制作待办事项列表。
首先创建一个只有 task.name 的任务。然后我转到 taskdetail.html,其中包含 task.detail、task.duedate 和 task.done 的表单。后者是一个布尔值,如果任务完成则为真。我的模板中有以下内容:

<input type="hidden" name="done" value=0 /> <input type="checkbox" name="done" value=1 {% if task.done %} checked {% endif %}>

在我的views.py中,我有:

def taskdetail(request, task_id):
task = Task.objects.get(pk=task_id)
if request.method == 'POST':
    form = DetailTaskForm(request.POST)
    if form.is_valid():            
        task.name = form.cleaned_data["name"]
        task.description = form.cleaned_data["description"]
        task.done = form.cleaned_data["done"]
        task.duedate = form.cleaned_data["duedate"]
        task.save()
        ...

奇怪的是,task.done 总是以正确的方式结束。默认是假的,在task.done = form.cleaned_data["done"]之前我已经验证确实是假的

我在某处读到 value=0 与 false 相同,但这似乎对我不起作用。我也试过

<input type="hidden" name="done" value="" />

但后来我的 form.is_valid 返回 false。

这里可能是什么问题?(我正在使用 Django 2.1 和 python 3.7)

EDIT1:威廉的回答让我走上了正轨,但我的问题还没有完全解决。我现在将 task.done 默认设置为 False,并使其不是必填字段。我将模板更改为:

<input type="hidden" name="done" value="" />
<input type="checkbox" name="done" value=1 {% if task.done %} checked {% endif %}>  
{% if task.done %}
     <input type="hidden" name="done" value="on" />
{% endif %}

我发送到表单的 {{task.done}} 是 False,我看不到如何在表单中对其进行操作并将其设置为 True。(仅在发布后)因此,我应该能够检查复选框是否已被勾选,而不是检查 task.done == True。

标签: django

解决方案


如果复选框是 POST 数据的一部分,则将其视为“已选中”,如果不在POST 数据中,则将其视为未选中,如W3 建议的“表单”部分中所述

复选框

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

因此,如果任务未完成,您可以通过渲染字段来使用上述“技巧” ,例如:

{% if task.done %}
<input type="hidden" name="done" value="on" />
{% endif %}

推荐阅读