表单中的django boolean始终返回true

时间:2018-10-21 18:07:10

标签: django

学习Django,并尝试制作待办事项清单。
首先仅使用task.name创建任务。然后,我进入taskdetail.html,其中包含task.detail,task.duedate和task.done的表单。后者是一个布尔值,如果任务完成,则为true。 我的模板中包含以下内容:

<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总是正确。默认为false,在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,我应该能够检查复选框是否已被选中。

2 个答案:

答案 0 :(得分:1)

Forms section of the W3 recommendations中所指定,如果复选框是POST数据的一部分,则该复选框被视为“已选中”,如果在POST数据中是 not ,则该复选框未被选中:

  

复选框

     

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

因此,您可以通过 not 渲染字段来使用上面的“技巧”,以防万一任务没有完成,例如:

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

答案 1 :(得分:0)

此问题已通过以下代码解决:

在forms.py中,添加required = False为完成

class DetailTaskForm(TaskForm):
description = forms.CharField(max_length = 600)
done = forms.BooleanField(initial=False, required=False)
duedate = forms.DateField()

在我的模板中:默认情况下,“ done”的值设置为“”,因此没有任何内容。仅当选中此复选框时,“完成”才会获得一个值(在这种情况下为“ on”,但是任何值都可以。感谢Willem使我步入正轨

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