Flask使用render_template传值时保留POST提交的车型参数问题
问题原因
- 你添加的存储车型的
<input>字段没有放在配置版本对应的提交表单内部,你页面上每个车型选择按钮、每个配置选择按钮都对应独立的<form>标签,只有处于<form>标签内部的字段才会随POST请求提交到后端,所以你点击配置按钮时该字段没有被提交,后端拿到的就是空值。 - 另外你当前渲染模板时只传递了
currentmodel参数,但input里用的是selectedmodel变量,二者不匹配,也会导致input的value值为空。
修复方案(按改动量从小到大排序)
方案1:调整表单结构(最小改动)
- 首先统一变量名,你可以直接把input里的变量替换为已经传递的
currentmodel,同时给input加type="hidden"隐藏输入框 - 将隐藏input放到配置选择的表单内部,修改后循环生成配置按钮的代码如下:
{% for trim in CAR_DATA%} <div class="mybuttonparent"> <form method="POST" action="/order"> <input type="hidden" name="userselectedcar" value="{{currentmodel}}" /> <button class="btn" type="submit" name="trim" value="{{trim.trim}}">{{trim.trim}}</button> </form> </div> {% endfor %}
- 后端直接通过
carmodeltype = request.form.get("userselectedcar")就能拿到选中的车型,同时可以通过request.form.get("trim")拿到选中的配置版本。
方案2:用session存储选中车型(更简洁,无需反复传参)
- 首先给Flask应用设置密钥(session必须要配置):
app = Flask(__name__) app.secret_key = "自定义任意字符串,不要泄露"
- 在用户选中车型的逻辑里,把车型存入session:
if request.form.get("Model 3 Button"): # 原有逻辑不变 session['selected_car'] = "Model 3" return render_template("order.html", ......) # 原有参数不变
- 后续任何请求都可以直接从session取值,不需要依赖表单传递:
carmodeltype = session.get("selected_car")
方案3:用动态路由传递参数(符合REST规范)
- 修改路由定义支持路径参数:
@app.route('/order', methods=['GET', 'POST']) @app.route('/order/<string:model>', methods=['GET', 'POST']) def order_page(model=None): # 函数内部可以直接拿到model参数的值
- 选中车型后重定向到对应路径,或者直接修改配置表单的提交路径:
<form method="POST" action="{{ url_for('order_page', model=currentmodel) }}">
内容的提问来源于stack exchange,提问作者Rickybobby
相关产品推荐
相关产品推荐

