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

Flask同页面多表单及复选框数据获取问题求助

Flask多表单使用及复选框取值异常问题

原问题:第二个表单提交报错"Choices cannot be None"

我尝试在Flask同一页面使用两个表单:第一个AvailableBDDForm用于收集信息列出可用数据库,再将这些数据库作为选项传递给第二个ControlerBDDForm的SelectField。

表单定义(views.py)

class AvailableBDDForm(FlaskForm):
    host = StringField('host', 
    validators=[DataRequired()])
    port = StringField('port', 
    validators=[DataRequired()])
    user = StringField('user', 
    validators=[DataRequired()])
    password = StringField('password', validators=[DataRequired()])
    submitAvailableBDD = SubmitField('METTRE A JOUR LA LISTE')
    next = HiddenField()

class ControlerBDDForm(FlaskForm):
    database = SelectField('database', validators=[DataRequired()])
    submit = SubmitField('SE CONNECTER')
    next = HiddenField()

    def update_choices(self, databases):
        self.database.choices = databases

路由代码

@app.route("/analye-bdd/", methods=("GET","POST",))
def analyse_bdd():
    availableForm = AvailableBDDForm()
    controlerForm = ControlerBDDForm()

    selected_options = []
    scroll=""
    
    bdd = BDD()
    available_databases = bdd.lister_bdd()
    
    try:
        if availableForm.validate_on_submit():
            print("first if")
            bdd.update_parameters(availableForm.host.data, availableForm.port.data, availableForm.user.data, availableForm.password.data)
            available_databases = bdd.lister_bdd()
            print(available_databases)
            controlerForm.update_choices(available_databases)
    
        if controlerForm.validate_on_submit():
            print("helloooo")
        
    
    except Exception as e:
        print(f"An error occurred: {e}")
    
    return render_template(
        "analyse-bdd.html",
        title="Analyze",
        AvailableBDDForm=availableForm,
        ControlerBDDForm=controlerForm,
        selected_options=selected_options, 
        scroll_to=scroll,
        host = bdd.host,
        port=bdd.port,
        database=bdd.database,
        user=bdd.user,
        password=bdd.password
    )

HTML表单代码

<form method="POST" action="{{ url_for('analyse_bdd')}}">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
    {{ AvailableBDDForm.host(size=30, value=host, class="texteInput")}}
    {{ AvailableBDDForm.port(size=10, value=port) }}
    {{ AvailableBDDForm.user(size=30, value=user) }}
    {{ AvailableBDDForm.password(size=30, value=password) }}
    {{ AvailableBDDForm.next }}
    <br>
    {{ AvailableBDDForm.submitAvailableBDD(class_="btn btn-primary") }}
</form>

<form method="POST" action="{{ url_for('analyse_bdd')}}">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> 

    <label>Database</label>
    
        {{ ControlerBDDForm.database }}
        {{ ControlerBDDForm.submit(class_="btn btn-primary") }}
</form>

问题现象

点击第一个表单的提交按钮(关联AvailableBDDForm)时,终端输出正常,功能可用;但点击第二个表单的提交按钮(关联ControlerBDDForm)时,出现错误An error occurred: Choices cannot be None,且未触发任何调试打印信息。调整验证逻辑后仍无输出。


编辑后新问题:复选框内容仅在第一个表单提交时获取到

原问题已解决,但出现新问题:HTML页面中有一组复选框,通过以下代码获取内容:

for field_name in bdd.analyze_options:
    if request.form.get(field_name):
        selected_options.append(request.form.get(field_name))

print("selected options", selected_options)

analyze_results = bdd.affichage_analyse(selected_options)
print(f"analyze results {analyze_results}")

将此代码放入如下路由后:

@app.route("/analyze/", methods=("GET","POST",))
def analyze():
    bdd = BDD()
    form = AvailableBDDForm(request.form, data=session.get('avail_bdd', {}))
    selected_options = []
    analyze_results = {}
    scroll_to = ""

    if form.validate_on_submit():
        data = {k:v for k,v in form.data.items() if k in ('host', 'port', 'user', 'password',)}
        if session.get('avail_bdd', {}) != data:
            session['avail_bdd'] = data
            return redirect(url_for('analyze'))

    if 'avail_bdd' in session: 

        bdd.update_parameters(**session['avail_bdd'])
        form1 = ControlerBDDForm(request.form, data=session.get('ctrl_bdd', {}))
        form1.update_choices(bdd.lister_bdd())
        if form1.validate_on_submit():
            session['ctrl_bdd'] = {k:v for k,v in form1.data.items() if k in ('database',)}
            print(form1.database.data)

            scroll_to = "for-scroll-results"

            for field_name in bdd.analyze_options:
                if request.form.get(field_name):
                    selected_options.append(request.form.get(field_name))

            print("selected options", selected_options)

            analyze_results = bdd.affichage_analyse(selected_options)
            print(f"analyze results {analyze_results}")
            
            return redirect(url_for('analyze'))

    return render_template('analyze.html', **locals(), 
                           title="Analyze BDD")

问题现象

selected_options仅在点击AvailableBDDForm的提交按钮时才有内容,希望仅在ControlerBDDForm验证通过时执行这部分代码,多次调整代码位置均未解决。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:35:56