为什么我的FlaskForm未点击提交按钮就自动触发提交?
你遇到的问题核心诱因就是同页面多个表单提交到同一个路由,WTForms的is_submitted()判断逻辑非常简单:只要当前请求是POST/PUT/PATCH/DELETE类型,不管提交的字段是否属于当前表单,都会返回True。单表单场景下不会有问题,多表单场景下只要有任意POST请求发往当前路由,所有表单的is_submitted()都会返回True,如果你没有加额外的区分逻辑,就会出现误触发。
如果刚打开页面(GET请求)就触发,还要排查你的另一个表单是否有页面加载自动提交的JS逻辑,或者是否是刷新了之前提交过POST请求的页面导致重复提交。
解决方法
方法1:给每个表单实例加唯一前缀
实例化表单的时候传入不同的prefix参数,让WTForms可以区分不同表单的字段,避免校验混淆,同时处理完表单后用重定向返回页面,避免刷新重复提交:from flask import Flask, render_template, redirect, url_for # 其余导入不变 @app.route("/", methods=["GET", "POST"]) def example(): # 多个表单的prefix不能重复 button1 = call_button(prefix="form1") # 第二个表单实例化示例:button2 = another_form(prefix="form2") if button1.validate_on_submit(): function() # 处理完后重定向,避免刷新页面重复提交 return redirect(url_for('example')) return render_template("example.html",template_button_1 = button1)方法2:增加提交按钮专属判断
给每个表单的提交字段设置不同的唯一名称,校验的时候额外判断当前提交的是不是对应表单的按钮:# 修改表单类,提交字段命名唯一不重复 class call_button(FlaskForm): submit1 = SubmitField("call function!") # 路由判断逻辑增加字段判断 from flask import request if button1.validate_on_submit() and 'submit1' in request.form: function()方法3:拆分表单提交路由
给每个表单设置不同的action属性,提交到不同的路由单独处理,处理完再重定向回原页面,从根源上避免冲突:<!-- example.html 中给每个表单指定不同提交地址 --> <div> <form method="POST" action="/handle_form1"> {{ template_button_1.hidden_tag() }} {{ template_button_1.submit() }} </form> </div> <!-- 第二个表单示例 --> <div> <form method="POST" action="/handle_form2"> {{ template_button_2.hidden_tag() }} {{ template_button_2.submit() }} </form> </div>后台对应新增两个路由单独处理每个表单的逻辑即可。
内容的提问来源于stack exchange,提问作者sonny_2d
相关产品推荐
相关产品推荐

