循环表单隐藏输入值传递异常:提交后值恒为1的原因与解决
问题描述
简化代码如下:
HTML模板代码
{% for c in categories %} <form action="" method="post"> {{ form.hidden_tag() }} <input type="hidden" name="e" value='{{ c.id }}'> {{ form.submit() }} {% endfor %}
Flask路由代码(routes.py)
categories = Category.query.all() form = AddAttributeForm() if form.validate_on_submit(): d = request.form.get('e') print(d)
现有3个分类,渲染后的HTML中每个循环生成的表单隐藏字段值是正确的:
<input type="hidden" name="e" value="1"> <input type="hidden" name="e" value="2"> <input type="hidden" name="e" value="3">
但提交任意表单时,e(即代码中的d)始终返回值1。
疑问
(1) 出现该问题的原因是什么?
(2) 如何解决以传递正确的c.id值?
问题解答
(1) 问题原因
循环中只打开了<form>标签却未闭合,导致所有表单控件被包含在第一个表单内。浏览器解析HTML时会自动补全未闭合标签,后续的<form>标签被忽略,点击任意提交按钮时实际提交的都是第一个表单,因此只会获取到第一个表单的e值(即1)。
(2) 解决方法
在循环内部为每个表单添加闭合标签,确保每个提交按钮归属独立的表单:
修改后的HTML模板代码:
{% for c in categories %} <form action="" method="post"> {{ form.hidden_tag() }} <input type="hidden" name="e" value='{{ c.id }}'> {{ form.submit() }} </form> <!-- 新增表单闭合标签 --> {% endfor %}
调整后每个表单相互独立,点击对应按钮时会提交所属表单,即可获取正确的c.id值。
内容的提问来源于stack exchange,提问作者toie
相关产品推荐
相关产品推荐

