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

如何在Flask表单中区分多个提交按钮并执行不同操作?

如何在Flask表单中区分多个提交按钮并执行不同操作?

我来帮你搞定这个问题~你现在的核心需求是没法区分四个提交按钮的触发事件,其实Flask-WTF已经提供了很简单的判断方式,咱们一步步来调整:

首先先修正你现有代码里的几个小错误,不然功能会出问题:

第一步:修正forms.py里的字段笔误

你把maximum_temp误写成了SubmitField,这明显是手滑了,应该改成StringField,同时可以把按钮命名对应上功能,更清晰:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField

class Form_Setting(FlaskForm):
    email_adress = StringField(label='Email')
    dooralarm_time = StringField(label='Türalarm')
    minimum_temp = StringField(label='MinTemp')
    maximum_temp = StringField(label='MaxTemp')  # 修正为StringField
    submit_email = SubmitField(label='Eingabe')
    submit_door = SubmitField(label='Eingabe')
    submit_temp_min = SubmitField(label='Eingabe')  # 对应最小温度提交
    submit_temp_max = SubmitField(label='Eingabe')  # 对应最大温度提交

第二步:修正settings.html里的字段绑定错误

你在最小温度和最大温度的表单里,错误绑定了dooralarm_time字段,得改成对应的目标字段:

<!--Temp. Schwellwert Minimal 修正后-->
<div class="row ">
    <div class="col-sm-12">
        <div class="d-flex justify-content-start align-items-center" style="height: 8vh;">
            <div class="col-sm-3 ">
                <h3 class="setting-label">Temp. Schwellwert Minimal</h3>
            </div>
            <div class="col-sm-9">
                <form  method="POST" class="form-register flex-fill d-flex" >
                    {{ form.hidden_tag() }}
                    {{ form.minimum_temp(class="form-control", placeholder="Temp. Minimal") }}
                    {{ form.submit_temp_min(class="btn btn-md btn-block btn-primary", style="background-color: #6941c6; border:none; color: #f9f5ff; margin-left: 1vw;" )}}
                </form>
            </div>
        </div>
        <hr class="divider">
    </div>
</div>

<!--Temp. Schwellwert Maximal 修正后-->
<div class="row ">
    <div class="col-sm-12">
        <div class="d-flex justify-content-start align-items-center" style="height: 8vh;">
            <div class="col-sm-3 ">
                <h3 class="setting-label">Temp. Schwellwert Maximal</h3>
            </div>
            <div class="col-sm-9">
                <form  method="POST" class="form-register flex-fill d-flex" >
                    {{ form.hidden_tag() }}
                    {{ form.maximum_temp(class="form-control", placeholder="Temp. Maximal") }}
                    {{ form.submit_temp_max(class="btn btn-md btn-block btn-primary", style="background-color: #6941c6; border:none; color: #f9f5ff; margin-left: 1vw;" )}}
                </form>
            </div>
        </div>
        <hr class="divider">
    </div>
</div>

第三步:在routes.py里区分不同提交按钮

核心逻辑很简单:当某个提交按钮被点击时,对应的SubmitField的data属性会变成True,咱们只要在form.validate_on_submit()之后判断这个值就行。另外建议你更新现有设置记录而不是每次新增,不然数据库会攒一堆重复数据:

from page import app
from flask import render_template, redirect, url_for
from page.models import Settings
from page.forms import Form_Setting
from page import db

@app.route('/settings', methods=['GET','POST'] )
def Settings_Page():
    form = Form_Setting()
    # 获取现有设置记录,没有则新建(假设你的Settings是单条记录存储全局设置)
    current_settings = Settings.query.first() or Settings()
    
    if form.validate_on_submit():
        # 判断是邮箱提交按钮被触发
        if form.submit_email.data:
            current_settings.email_adress = form.email_adress.data
        # 判断是门警报时间提交按钮被触发
        elif form.submit_door.data:
            current_settings.dooralarm_time = form.dooralarm_time.data
        # 判断是最小温度提交按钮被触发
        elif form.submit_temp_min.data:
            current_settings.minimum_temp = form.minimum_temp.data
        # 判断是最大温度提交按钮被触发
        elif form.submit_temp_max.data:
            current_settings.maximum_temp = form.maximum_temp.data
        
        # 保存到数据库
        db.session.add(current_settings)
        db.session.commit()
        return redirect(url_for('Settings_Page'))
    
    # GET请求时,把现有设置填充到表单里
    form.email_adress.data = current_settings.email_adress or ""
    form.dooralarm_time.data = current_settings.dooralarm_time or ""
    form.minimum_temp.data = current_settings.minimum_temp or ""
    form.maximum_temp.data = current_settings.maximum_temp or ""
    
    return render_template('settings.html',form=form)

另外还有一种备选方法:通过request.form检查按钮的name是否存在,比如if 'submit_email' in request.form:,效果和上面的方法完全一致,选你习惯的就行。

备注:内容来源于stack exchange,提问作者aNewDivide

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:50:30