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

如何在Flask中获取提交表单的单选框值并转为字典格式?

解决测验应用的表单提交与结果处理问题

首先得修正你的HTML表单里的一个关键问题——现在所有单选按钮的name属性都是option,这会导致用户只能选中所有问题中的一个选项(相同name的单选框属于同一组)。得把每个问题的单选框组和问题ID绑定起来,这样才能分别获取每个问题的选择:

修改HTML里radio的name属性,改成"q_{{i['id']}}":

<form action="" class="text-left ml-4" method="POST">
    {% for i in data %}
    <h5>{{i['id']}}. {{i['question']}}</h5>
    <div class="form-check">
        <label class="form-check-label">
            <input class="form-check-input" type="radio" name="q_{{i['id']}}" value="A" > {{i['chA']}}
        </label>
    </div>
    <div class="form-check">
        <label class="form-check-label">
            <input class="form-check-input" type="radio" name="q_{{i['id']}}" value="B">{{i['chB']}}
        </label>
    </div>
    <div class="form-check">
        <label class="form-check-label">
            <input class="form-check-input" type="radio" name="q_{{i['id']}}" value="C" > {{i['chC']}}
        </label>
    </div>
    <div class="form-check">
        <label class="form-check-label">
            <input class="form-check-input" type="radio" name="q_{{i['id']}}" value="D" > {{i['chD']}}
        </label>
    </div>
    <br>
{% endfor%}
<div class="col-md-12 text-center mb-1">
    <button type="submit" class="btn-new btn-lg"> Submit </button>
</form>

然后修改Flask的POST处理部分,从request.form中提取每个问题的ID和对应的选项值,构建你需要的字典格式:

@app.route('/test', methods=['GET','POST'])
@is_logged_in
def test():
    if request.method == 'POST':
        # 初始化存储结果的字典
        quiz_results = {}
        # 遍历表单提交的所有键值对
        for key, value in request.form.items():
            # 提取问题ID:key格式是q_1、q_2,分割后取第二部分转成整数
            question_id = int(key.split('_')[1])
            quiz_results[question_id] = value
        # 现在quiz_results就是{1:A, 2:B...}的格式了
        app.logger.info(quiz_results)
        
        # 这里可以添加后续逻辑,比如和正确答案对比、存储到数据库等
        # 示例:
        # cur = mysql.connection.cursor()
        # for q_id, ans in quiz_results.items():
        #     cur.execute("INSERT INTO user_answers(user_id, question_id, answer) VALUES (%s, %s, %s)", 
        #                 (session['user_id'], q_id, ans))
        # mysql.connection.commit()
        
    # 获取问题数据的逻辑放在外面,GET和POST请求都能拿到
    cur = mysql.connection.cursor()
    cur.execute("SELECT * FROM questions")
    data = cur.fetchall()
    # 记得关闭游标,避免资源泄漏
    cur.close()
    return render_template('quiz.html', data=data)

关键说明:

  • HTML修改原因:把单选框的name设置为q_{{i['id']}},确保每个问题的选项组独立,提交表单时每个选中的选项都会被正确传递到后端。
  • Flask处理逻辑:通过遍历request.form的键值对,拆分键名得到问题ID,对应的值就是用户选中的选项,最终构建出你需要的字典结构。
  • 额外优化:获取完数据库数据后关闭游标;如果需要保存用户答案,可以在遍历结果字典时执行数据库插入操作。

内容的提问来源于stack exchange,提问作者Sujeet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:17:11