You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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']

问题根源

  1. 表单提交逻辑错误:按钮被包裹在<a>标签内,且按钮type="button",点击时会触发<a>的GET请求,完全没有提交表单,导致表单数据没有发送到后端。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:22:56