Flask项目中获取表单ID时出现KeyError问题求助
解决表单提交触发KeyError: 'ID'的问题
问题场景
尝试从HTML表单的下拉选择框获取ID值,在Flask的app.py中通过request.form['ID']调用时触发KeyError: 'ID'错误。
相关代码
tripd.html
<div class="col-lg-6 mx-auto"> <form action="POST"> <select id="ID" name ="ID"> {% for mem in membies %} <option value="{{mem['ID']}}">{{mem['name']}}</option> {% endfor %} </select> <a href="{{url_for('addatt', trip_id=trip_id)}}"><button type="button" class="btn btn-primary">Add Attendee</button></a> </form> </div>
app.py
@app.route('/trips/<trip_id>/attendees/add', methods=["GET", "POST"]) def addatt(trip_id): member_id=request.form['ID'] database.add_member_trip(trip_id, member_id) return redirect(url_for('trip', trip_id=trip_id))
错误信息
KeyError: 'ID' # 触发错误的代码行:member_id=request.form['ID']
问题根源
- 表单提交逻辑错误:按钮被包裹在
<a>标签内,且按钮type="button",点击时会触发<a>的GET请求,完全没有提交表单,导致表单数据没有发送到后端。 - form标签属性错误:
action="POST"是错误写法,action应指定表单提交的目标路由,请求方法需要通过method="POST"单独设置。
修复方案
修正后的tripd.html代码
<div class="col-lg-6 mx-auto"> <!-- 设置正确的请求方法和提交路由 --> <form method="POST" action="{{url_for('addatt', trip_id=trip_id)}}"> <select id="ID" name ="ID"> {% for mem in membies %} <option value="{{mem['ID']}}">{{mem['name']}}</option> {% endfor %} </select> <!-- 改为submit类型按钮,去掉多余的a标签 --> <button type="submit" class="btn btn-primary">Add Attendee</button> </form> </div>
优化后的app.py代码(增强健壮性)
@app.route('/trips/<trip_id>/attendees/add', methods=["GET", "POST"]) def addatt(trip_id): if request.method == 'POST': # 使用get方法避免KeyError,可设置默认值 member_id = request.form.get('ID') if member_id: database.add_member_trip(trip_id, member_id) return redirect(url_for('trip', trip_id=trip_id)) # GET请求时返回对应页面 return redirect(url_for('trip', trip_id=trip_id))
说明
- 按钮改为
type="submit"后,点击会直接提交表单,自动携带下拉框选中的ID值。 - 使用
request.form.get('ID')替代直接索引,能在字段不存在时返回None,避免触发KeyError,提升代码容错性。
内容的提问来源于stack exchange,提问作者L_is_trying_to_code
相关产品推荐
相关产品推荐

