为何request.POST总会包含按钮名称?如何避免该情况?
我的HTML代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> {% load static %} <script src="{% static 'jquery-3.6.2.min.js' %}"></script> <script src="{% static 'jquery.js' %}"></script> </head> <body> <form action="{% url 'index' %}" method="post"> {% csrf_token %} <button name="button1">button1</button> <button name="button2">button2</button> <input type="text" name="textbox"> </form> </body> </html>
每当我在文本框输入内容(例如“hi”)并按下回车,request.POST返回内容如下:
<QueryDict: {'csrfmiddlewaretoken': ['FX1qFNzbQUX3fYzAwW27cOu83omLzifnlLU5X0WXXVdOiyNretM5b3VgsGy1OogA'], 'button1': [''], 'textbox': ['hi']}>
请问:
- 为何未点击button1,
request.POST中却包含'button1': ['']? - 有没有办法避免
request.POST中出现'button1': ['']?
原因解释
这是HTML表单的默认行为:当表单内存在未指定type属性的<button>元素时,第一个<button>会被浏览器默认识别为type="submit"类型的提交按钮。当你在文本框中按下回车触发表单提交时,浏览器会自动将这个默认提交按钮的名称(即使未手动点击)纳入POST数据中,因为浏览器判定你触发了该默认按钮的提交动作。
解决办法
有几种可行的方式避免这个情况:
- 给非提交按钮指定
type="button":将不需要触发表单提交的按钮类型明确设为button,这样浏览器不会把它们当作提交按钮,回车提交时就不会带上其参数。修改后的按钮代码如下:<button name="button1" type="button">button1</button> <button name="button2" type="button">button2</button> - 明确指定唯一的提交按钮:如果需要某个按钮作为提交触发点,给它指定
type="submit",其余按钮设为type="button"。这样回车提交时只会带上这个指定提交按钮的参数(若存在),其他按钮不会被包含。 - 移除按钮的
name属性:如果不需要通过按钮的name来区分操作,可以直接去掉按钮的name属性,这样POST数据里自然不会出现对应的键值对,但这种方法仅适用于不需要按钮参与表单逻辑的场景。
内容的提问来源于stack exchange,提问作者Vasilii
相关产品推荐
相关产品推荐

