【问题标题】:Flask custom ValidationError doesn't surface errorFlask 自定义 ValidationError 不会显示错误
【发布时间】:2021-07-08 23:29:59
【问题描述】:

我正在研究 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.')

感谢您阅读我的问题!

【问题讨论】:

  • 尝试清除缓存并重新加载 EditProfile 页面
  • @GitauHarrison 我尝试清除我的缓存和另一个浏览器。行为没有变化(即故意导致验证失败不会出现错误)。
  • 请分享您项目的链接,以便我查看

标签: python flask flask-wtforms validationerror


【解决方案1】:

问题最终是我的表单模板 - 我犯了迭代“错误”而不是“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 %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2021-02-08
    • 2019-02-12
    • 2012-11-15
    相关资源
    最近更新 更多