Flask Jinja2循环内提交按钮值区分及表单值留存问题求助
解决Jinja循环内表单按钮提交值丢失问题
问题根源
你当前的代码中,所有循环生成的<input type="hidden" name="bintype">都使用同一个name属性。当表单提交时,浏览器只会发送最后一个bintype的值,导致循环内的按钮无法关联对应索引的数值。之前尝试的namespace和自定义宏是用来维护循环内变量的,和表单提交参数冲突的问题无关,所以无效。
可行解决方案
方案1:将bintype编码到提交按钮的value中
把loop.index0和按钮标识合并到value里,后端接收后拆分解析:
{% for display in graphkv['stdbintxt'][graphkv['dvNL'][loop.index0]]['all'] %} <br> <br>DEBUG: loop={{ loop.index0 }} , dvtype={{ cntsD['dvtype'] }} , bintype={{ loop.index0 }}<br> {{ display }} <input type="submit" form="formDV" name="dvgotowardbeginning" value="{{ loop.index0 }}|<" > <input type="submit" form="formDV" name="dvgotowardend" value="{{ loop.index0 }}|>" > {% endfor %}
后端处理示例(以Python为例):
if request.form.get('dvgotowardbeginning'): bintype, _ = request.form['dvgotowardbeginning'].split('|') # 处理向前逻辑 elif request.form.get('dvgotowardend'): bintype, _ = request.form['dvgotowardend'].split('|') # 处理向后逻辑
方案2:给提交按钮的name添加bintype后缀
让每个按钮的name包含对应的loop.index0,后端通过判断哪个name存在来获取bintype:
{% for display in graphkv['stdbintxt'][graphkv['dvNL'][loop.index0]]['all'] %} <br> <br>DEBUG: loop={{ loop.index0 }} , dvtype={{ cntsD['dvtype'] }} , bintype={{ loop.index0 }}<br> {{ display }} <input type="submit" form="formDV" name="dvgotowardbeginning_{{ loop.index0 }}" value="<" > <input type="submit" form="formDV" name="dvgotowardend_{{ loop.index0 }}" value=">" > {% endfor %}
后端处理示例(以Python为例):
for key in request.form: if key.startswith('dvgotowardbeginning_'): bintype = key.split('_')[-1] # 处理向前逻辑 elif key.startswith('dvgotowardend_'): bintype = key.split('_')[-1] # 处理向后逻辑
方案3:为每个循环项创建独立表单
每个循环项对应一个单独的表单,确保hidden字段只和当前按钮关联:
{% for display in graphkv['stdbintxt'][graphkv['dvNL'][loop.index0]]['all'] %} <br> <br>DEBUG: loop={{ loop.index0 }} , dvtype={{ cntsD['dvtype'] }} , bintype={{ loop.index0 }}<br> {{ display }} <form id="formDV_{{ loop.index0 }}" action="{{ form_action }}" method="post"> <input type="hidden" name="bintype" value="{{ loop.index0 }}"> <input type="submit" name="dvgotowardbeginning" value="<" > <input type="submit" name="dvgotowardend" value=">" > </form> {% endfor %}
注意替换{{ form_action }}为你原表单的提交地址,同时可以移除原来的主表单formDV。
内容的提问来源于stack exchange,提问作者Charles Reese
相关产品推荐
相关产品推荐

