我的模板中包含以下代码:

<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"始终是category中的最后一个votes值。

例如,如果votes=[('a',1),('b',2),('c',3)],则request.POST['votedCat']返回'c',无论使用哪个输入按钮提交表单。我做错什么了?

最佳答案

因为只有一种形式,所以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。

关于python - POST数据的Django模板变量值错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4254252/

10-10 09:23