学习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,我应该能够检查复选框是否已被选中。
答案 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 %}