我的模板中有以下代码:
<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'
。我做错什么了?在
因为您只有一个表单,其中包含的值。如果您访问
votedCat
的多个输入。单击任意一个按钮提交整个表单,其中包含^{request.POST.getlist('votedCat')
,您将看到您实际上拥有所有的值。在有两种方法可以解决这个问题。第一种方法是为循环中的每个迭代使用单独的form元素—为此,只需将}元素移动到循环中。在
<form>
和{第二种方法是让
votedCat
输入实际上是submit按钮:这里的缺点是,现在在变量中有单词“Vote for”,需要在视图代码中解析出来。在
比这两者都好的是有一个简单的单选按钮集或带有一个提交按钮的选择框,但我知道设计要求有时会妨碍到您。在
最后,您应该真正使用Django的表单框架,而不是使用手动HTML和直接处理POST。在
我不确定这是否是最佳解决方案,但您可以在循环中创建一个新的
form
:您可以考虑使用^{} 类来构建和处理表单。在
相关问题 更多 >
编程相关推荐