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 中,当我有两个使用 &lt;input/&gt; 标签的按钮时,它实际上会将我没有单击的按钮视为输入。这样,当我测试像 'sendPaperButton' in request.POST 这样的东西时,它会返回与我想要的相反的结果。

我将这些更改为&lt;button&gt;&lt;/button&gt; 标签,效果很好。

【讨论】:

【参考方案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 不发送数据

基于 django RestFramework ,加工或者修改 request.POST 的数据内容

Django

从django模板提交通过POST传递其他数据

我用django接收post请求结果为空