如何在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
相关产品推荐
相关产品推荐

