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

