在表单验证用户名和邮箱是否与数据库匹配的时候使用flash()闪存消息虽然很方便,但flash信息与wtf_forms的错误信息二者视觉上无法达到统一,不够完美,因此介绍两种将自定义验证信息写入flask_wtf内置验证器的方法。
方法一、表单验证器中添加规则
示例: 在注册时验证用户名是否存在:只需关注validate_email()
方法,validate_*字段名必须跟需要验证的字段名完全一致
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired, Email
from app.models import User
class registerForm(FlaskForm):
email = StringField('邮箱',validators=[
DataRequired('邮箱不能为空'),
Email('请输入正确的邮箱格式')
],render_kw={
'placeholder': '请输入邮箱',
'class': 'form-control form-control-light',
'type': 'email'
})
# 验证邮箱是否已注册
# 该方法将自动添加验证规则添加到form.email.errors中
def validate_email(self, email):
user = User.query.filter_by(email = email.data).first()
if user:
raise ValidationError('邮箱已被注册')
方法二、路由器中添加规则
若不想使用上面第一种方法,那么我们还可以在路由器或者其它地方设置验证规则。
还是注册用户为例:只需关注process_errors
,它的作用是将自定义验证规则信息预存到验证错误列表
from app.forms import registerForm
from app.models import User
@app.route('/register',methods = ['GET','POST'])
def register():
form = registerForm()
user = User.query.filter_by(email = form.email.data).first()
if user:
# 将验证信息预存到验证错误列表form.email.errors中
form.email.process_errors.append('邮箱已被注册')
if form.validate_on_submit():
# 通过验证后的业务代码...
剩下的就是在jinjia2的html模板中调用表单验证错误信息
{% if form.email.errors %}
{{ form.email.errors[0] }}
<!-- 或者 -->
<!-- {% for error in form.email.errors %}
{{ error }}
{% endfor %} -->
{% endif %}