Flask中WTForm字段自定义验证及内置验证消息不显示问题求解
Flask WTForm 问题修复方案
一、验证失败不显示错误提示的修复
问题根源:/submitform 路由验证失败后直接返回纯文本,没有将携带错误信息的表单实例传回模板渲染,导致前端无法读取错误字段。
修复方案:将验证失败的分支改为重新渲染注册页面,传入当前表单对象:
# 修改后的submitform路由 @app.route('/submitform', methods=["GET","POST"]) def submitform(): form = MyForm() if form.validate_on_submit(): return 'Form accepted successfully.' else: # 验证失败重新渲染表单页,携带错误信息 return render_template('customvalidator.html', form = form)
二、用户名重复自定义验证器的正确接入
修复后的验证器写法
WTForm 自定义验证器需要固定接收form(当前表单实例)、field(当前校验字段实例)两个参数,无需自行实例化表单,修改后代码如下:
def isDuplicate(form, field): appdatabase={"Alis":"Smith","Mike":"Brown","Paul":"Miller"} # 直接判断输入的用户名是否存在于模拟数据库的用户名列表中 if field.data in appdatabase.keys(): raise ValidationError("Username already exists! Please choose another one.")
接入验证器
将写好的isDuplicate函数添加到用户名字段的校验器列表中即可生效:
class MyForm(FlaskForm): # 把isDuplicate加到validators列表里 username = StringField('Username', validators=[InputRequired(message="This field is required."), isDuplicate]) password=PasswordField('Password', validators=[InputRequired(message="enter the password")]) confirm_password=PasswordField('Confirm Password', validators=[EqualTo('password', message="两次输入的密码不一致")]) submit = SubmitField('Register')
可选优化(HTML模板)
你当前模板只配置了用户名的错误提示,如果需要显示密码、确认密码的错误,可以参照用户名的写法补充对应字段的错误遍历逻辑,比如:
{{ form.password.label }} {{ form.password }} <ul> {% for error in form.password.errors %} <li style="color: red;">{{ error }} </li> {% endfor %} </ul> <br> {{ form.confirm_password.label }} {{ form.confirm_password }} <ul> {% for error in form.confirm_password.errors %} <li style="color: red;">{{ error }} </li> {% endfor %} </ul> <br><br>
内容的提问来源于stack exchange,提问作者PRJ
相关产品推荐
相关产品推荐

