Django模板变量的POST数据值错误?
我在我的模板里有以下代码:
<form action="" method="post">{% csrf_token %}
{%for category, category_votes in votes%}
<p>{{category}}: {{category_votes}} <!-- displays as expected -->
<input type="hidden" name="votedCat" value="{{category}}" id={{forloop.counter}}>
<input type="submit" name="upvote" value="Vote for...">
<input type="submit" name="downvote" value="Vote against...">
</p>
{%endfor%}
</form>
变量 {{category}}
在渲染时显示得很正常,但在查看 POST 数据时,"votedCat"
总是显示 votes
中最后一个 category
的值。
举个例子,如果 votes=[('a',1),('b',2),('c',3)]
,那么无论我用哪个输入按钮提交表单,request.POST['votedCat']
返回的都是 'c'
。我哪里做错了呢?
2 个回答
1
我不确定这是不是最好的解决办法,但你可以在循环里面创建一个新的 form
。
{%for category, category_votes in votes%}
<p>{{category}}: {{category_votes}} <!-- displays as expected -->
<form action="" method="post">{% csrf_token %}
<input type="hidden" name="votedCat" value="{{category}}" id={{forloop.counter}}>
<input type="submit" name="upvote" value="Vote for...">
<input type="submit" name="downvote" value="Vote against...">
</form>
</p>
{%endfor%}
你可以考虑使用 django.forms.Form
这个类来构建和处理你的表单。
3
因为你只有一个表单,里面有多个输入项用于 votedCat
。点击任意一个按钮都会提交整个表单,包含所有 votedCat
的值。如果你访问 request.POST.getlist('votedCat')
,你会发现其实你得到了所有的值。
解决这个问题有两种方法。第一种是为每次循环创建单独的表单元素——只需把 <form>
和 </form>
标签放到循环里面。
第二种方法是把 votedCat
输入项直接设置为提交按钮:
<input type="submit" name="votedCat" value="Vote for {{category}}" id={{forloop.counter}}>
这样做的缺点是,你的变量里会有“Vote for”这些字眼,你需要在视图代码中把它们解析掉。
其实,最好的方法是使用简单的单选按钮组或者下拉框,再加一个提交按钮,但我理解有时候设计要求会让事情变得复杂。
最后,你真的应该使用 Django 的表单框架,而不是手动写 HTML 和直接处理 POST 请求。