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

2024-10-02 10:33:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我的模板中有以下代码:

<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'。我做错什么了?在


Tags: 代码nameform模板forinputvaluetype
2条回答

因为您只有一个表单,其中包含votedCat的多个输入。单击任意一个按钮提交整个表单,其中包含^{的值。如果您访问request.POST.getlist('votedCat'),您将看到您实际上拥有所有的值。在

有两种方法可以解决这个问题。第一种方法是为循环中的每个迭代使用单独的form元素—为此,只需将<form>和{}元素移动到循环中。在

第二种方法是让votedCat输入实际上是submit按钮:

<input type="submit" name="votedCat" value="Vote for {{category}}" id={{forloop.counter}}>

这里的缺点是,现在在变量中有单词“Vote for”,需要在视图代码中解析出来。在

比这两者都好的是有一个简单的单选按钮集或带有一个提交按钮的选择框,但我知道设计要求有时会妨碍到您。在

最后,您应该真正使用Django的表单框架,而不是使用手动HTML和直接处理POST。在

我不确定这是否是最佳解决方案,但您可以在循环中创建一个新的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%}  

您可以考虑使用^{}类来构建和处理表单。在

相关问题 更多 >

    热门问题