Flask 自定义 ValidationError 不会显示错误

问题描述

我正在研究 Miguel Grinberg 很棒的 flask mega tutorial,并且正在努力弄清楚为什么当表单未通过自定义验证规则时我在浏览器、终端或日志文件中看不到任何错误

这是表单类:

    class EditProfileForm(FlaskForm):
      username = StringField('Username',validators=[Datarequired()])
      about_me = TextAreaField('About me',validators=[Length(min=0,max=140)])
      submit = SubmitField('Submit')
    
      def __init__(self,original_username,*args,**kwargs):
        super(EditProfileForm,self).__init__(*args,**kwargs)
        self.original_username = original_username
      
      def validate_username(self,username):
        if username.data != self.original_username:
          user = User.query.filter_by(username=self.username.data).first()
          if user is not None:
            print("There should be a validation error here")
            raise ValidationError('Please choose a different username.')

如您所见,我正在向控制台打印以确认正在执行验证器,并且满足条件。我确实在控制台中看到“此处应该存在验证错误”,但实际上并未引发验证错误

这是这个表格的路线:

    @app.route('/edit_profile',methods=['GET','POST'])
    @login_required
    def edit_profile():
      form = EditProfileForm(current_user.username)
      if form.validate_on_submit():
        current_user.username = form.username.data
        current_user.about_me = form.about_me.data
        db.session.commit()
        flash('Your changes have been saved.')
      elif request.method == 'GET':
        form.username.data = current_user.username
        form.about_me.data = current_user.about_me
      return render_template('edit_profile.html',title='Edit Profile',form=form)

我有一个表单类,它有一个非常相似的自定义验证器,它引发的 ValidationError 完美地工作。这是其他班级的样子...

具有有效 ValidationError 的类:

    class RegisterForm(FlaskForm):
      username = StringField('Username',validators=[Datarequired()])
      email = EmailField('E-mail address',validators=[Datarequired(),Email()])
      password = PasswordField('Password',validators=[EqualTo('password_confirm',message='Passwords must match')])
      password_confirm = PasswordField('Confirm Password',validators=[Datarequired()])
      submit = SubmitField('Register Account')
    
      def validate_username(self,username):
        user = User.query.filter_by(username=username.data).first()
        if user is not None:
          raise ValidationError('Please use a different username.')
      
      def validate_email(self,email):
        user = User.query.filter_by(email=email.data).first()
        if user is not None:
          raise ValidationError('Please use a different email address.')

感谢您阅读我的问题!

解决方法

问题最终是我的表单模板 - 我犯了通过“错误”而不是“form.username.errors”进行迭代的错误。我认为这不是问题,因为错误正确地出现在页面上以创建新用户 - 但这是一个不同的页面(这很明显,回想起来......)。

不正确的模板:

    {% for error in errors %}
    <span style="color: red;">[{{ error }}]</span>
    {% endfor %}

更正的模板:

      {% for error in form.username.errors %}
      <span style="color: red;">[{{ error }}]</span>
      {% endfor %}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...