Django request.POST 不包含提交表单的按钮的名称
Posted
技术标签:
【中文标题】Django request.POST 不包含提交表单的按钮的名称【英文标题】:Django request.POST does not contain the name of the button that submitted the form 【发布时间】:2011-01-10 17:09:22 【问题描述】:我有一个带有两个不同提交按钮的 django 表单,在表单提交到的视图中,我需要知道按下了哪个提交按钮并相应地采取不同的操作。
从我读到的提交按钮的名称或 id 应该在 request.POST 字典中的某个地方,但它不在那里!
这是我表单的一个片段:
<form id="editPaperForm" action="paper.editURL" method="POST">
<input type="submit" name="savePaperButton" id="savePaperButton" value="Save and Send Later"/>
<input type="submit" name="sendPaperButton" id="sendPaperButton" value="Save and send"/>
...
</form>
在视图中:
...
if 'sendPaperButton' in request.POST:
return applicants_confirmSend(request, paperID)
else:
return applicants_home(request)
sendPaperButton 从来没有在 request.POST 中,另一个也没有,我应该寻找其他地方吗?
我唯一的想法是添加一个隐藏字段并在发送表单之前通过 javascript 对其进行修改,但这似乎有点多余,因为我很确定数据应该在某个地方......
谢谢!
【问题讨论】:
您是否尝试过查看浏览器通过 Charles 或 Fiddler 等 http 调试器发送的内容? 不,我没有,但你让我对浏览器发送的内容感到好奇,所以我尝试了不同的浏览器(使用的是 Firefox 3.5,尝试了 Chrome 4 和 IE6),结果发现 Chrome 和 IE6 可以发送按钮 id 和值,Firefox 不会...猜测带有 Javascript 附加值的隐藏输入是我唯一的选择? 为什么不使用复选框或其他适当的表单元素? 您可以尝试使用按钮元素。但如果我没记错的话,IE6 可能会有一些问题。 我用最新的 Firefox (3.5.7) 测试过,效果很好。 【参考方案1】:由于某种原因,在 Chrome 中,当我有两个使用 <input/>
标签的按钮时,它实际上会将我没有单击的按钮视为输入。这样,当我测试像 'sendPaperButton' in request.POST
这样的东西时,它会返回与我想要的相反的结果。
我将这些更改为<button></button>
标签,效果很好。
【讨论】:
【参考方案2】:不要忘记将名称和值参数添加到表单的“按钮”或“输入类型=提交”字段。我曾经遇到过同样的问题,这让我发疯了。
简而言之,由于 request.POST 包含一个字典,因此您需要一个键和一个值。 key对应你的button的name参数,dict的value对应button的value。
<button type="submit" value="preview">Preview</button>
不会反映在 request.POST 中(POST 字典没有键!),而
<button type="submit" value="preview" name="preview">Preview</button>
会有一个值为“preview”的键“preview”。
【讨论】:
这正是我忘记的。感谢您的提示! 在最新版本的谷歌浏览器中遇到了这个问题,尽管它在最新版本的 Firefox 中运行良好。 这解决了我在表单字段具有唯一 ID 且没有name
时遇到的类似问题,并且 POST 不包含任何数据!快把我逼疯了!谢谢!以上是关于Django request.POST 不包含提交表单的按钮的名称的主要内容,如果未能解决你的问题,请参考以下文章
只有 Django request.body 包含数据(不是 request.POST)
在 Django 视图中调用“request.POST”时,Ajax POST 不发送数据