Django模板变量的POST数据值错误?

1 投票
2 回答
753 浏览
提问于 2025-04-16 07:29

我在我的模板里有以下代码:

<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 请求。

撰写回答