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

Python/Flask应用中循环生成复选框的参数获取异常问题

解决Flask复选框参数获取异常问题

问题根源

你的代码存在两个核心问题导致无法正确获取复选框值:

  1. 缺少<form>标签包裹表单元素:没有form标签时,浏览器无法正确收集并提交复选框的name和value参数,会默认传递on作为未正确绑定的值,或者直接丢失参数。
  2. 路由未处理表单提交请求:当前/formulaire_creat_congres路由仅响应GET请求,无法接收表单提交的参数(无论GET/POST)。

修复步骤

1. 完善HTML表单结构

给所有表单元素添加<form>标签,指定提交地址和方法(推荐用POST,避免参数暴露在URL中):

<!-- 包裹整个表单内容 -->
<form action="/formulaire_creat_congres" method="POST">
    <table>
        <tr>
            <td colspan="2" >
                <label><strong>Thématiques :</strong></label>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                {% for t in res_them %}
                    <div>
                        <input type="checkbox" id="{{ t[0] }}" name="nomtheme" value="{{ t[0] }}">
                        <label for="{{ t[0] }}">{{ t[0] }}</label>
                    </div>
                {% endfor %}
            </td>
        </tr>
    </table>
    
    <table>
        <tr>
            <td colspan="2" >
                <label><strong>Activités :</strong></label>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                {% for a in res_act %}
                    <div>
                        <input type="checkbox" id="{{ a[0] }}" value="{{ a[0] }}" name="nomactivite">
                        <label for="{{ a[0] }}">{{ a[0] }}</label>
                    </div>
                {% endfor %}
            </td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="Ajouter"></td>
        </tr>
    </table>
</form>

注意:你之前的Thématiques标签里写了{{ {t[0]} }}(多余的大括号),已经修正为{{ t[0] }},避免页面显示错误。

2. 修改Flask路由支持表单提交

更新路由,允许GET和POST方法,并在POST请求时获取复选框参数:

from flask import request, render_template

# 保持你的数据查询函数不变
def valeurs_thematiques():
    query_thematiques = """
    SELECT NOMTHEMATIQUE
    FROM THEMATIQUES
    """
    connection = connect(path)
    cursor = connection.cursor()
    cursor.execute(query_thematiques)
    res_them = cursor.fetchall()
    connection.close()
    return res_them

def valeurs_activites():
    # 这里建议修正SQL,应该查询ACTIVITES表的对应字段,而不是重复查THEMATIQUES
    query_activites = """
    SELECT NOMACTIVITE
    FROM ACTIVITES
    """
    connection = connect(path)
    cursor = connection.cursor()
    cursor.execute(query_activites)
    res_act = cursor.fetchall()
    connection.close()
    return res_act

@app.route('/formulaire_creat_congres', methods=['GET', 'POST'])
def formulaire_creat_congres():
    res_them = valeurs_thematiques()
    res_act = valeurs_activites()
    
    if request.method == 'POST':
        # 用request.form.getlist获取POST提交的复选框值
        selected_themes = request.form.getlist("nomtheme")
        selected_activites = request.form.getlist("nomactivite")
        # 这里可以添加处理逻辑,比如存入数据库
        print("选中的主题:", selected_themes)
        print("选中的活动:", selected_activites)
    
    return render_template('formulaire_creat_congres.html', res_them=res_them, res_act=res_act)

注意:如果你坚持用GET方法提交,把form的method改成GET,然后用request.args.getlist()获取值,但GET不适合处理包含多选框的表单,因为参数会暴露在URL中且长度有限制。

3. 额外修正:数据查询函数的逻辑问题

你的valeurs_activites函数查询的是THEMATIQUES表的NOMTHEMATIQUE,这显然不符合“获取活动列表”的需求,建议修正为查询ACTIVITES表的对应字段(比如NOMACTIVITE),避免页面显示重复内容。

验证效果

启动Flask应用后,访问/formulaire_creat_congres,勾选复选框并点击“Ajouter”,后端控制台会打印出选中的主题和活动名称,即为正确获取到的参数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:55:14