Saturday, 31 October 2020

Flask wtforms ValidationError not displayed to user

I'm using flask wtforms with input validation. Everything's working fine, except with validation failure my ValidationError message is not getting displayed to the user...

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, PasswordField, ValidationError # URLField, EmailField
from wtforms.validators import DataRequired, Email, EqualTo

class SignupForm(FlaskForm):
    name = StringField("Name:", validators=[DataRequired()])
    email = StringField("Email:", validators=[DataRequired(), Email()])
    password = PasswordField("Password:", validators=[DataRequired(), EqualTo('pass_confirm', message='Passwords must match')])
    pass_confirm = PasswordField("Confirm:", validators=[DataRequired()])
    submit = SubmitField("Create Account")

    def validate_email(self, field):
        if User.query.filter_by(email=field.data).first():
            raise ValidationError('Your email has already been registered.')

    def validate_name(self, field):
        if User.query.filter_by(name=field.data).first():
            raise ValidationError('This username is taken.')

and in my view:

@users.route('/signup', methods=['GET','POST'])
def signup():
    form = SignupForm()

    if form.validate_on_submit():
        url = form.name.data # todo: generate unique url
        user = User(name=form.name.data,
                    url=url,
                    email = form.email.data,
                    password = form.password.data)
        db.session.add(user)
        db.session.commit()

        return redirect(url_for('users.login'))

    return render_template('signup.html', form=form)

and this is the template:

<div class="jumbotron">
  <h1>Sign up Page</h1>
  <p>Please fill out the form</p>
  <form method="POST">
    
    <div class="form-group">
      
      
    </div>

    <div class="form-group">
      
      
    </div>

    <div class="form-group">
      
      
    </div>

    <div class="form-group">
      
      
    </div>

      
  </form>

</div>

Upon submitting an invalid form (either invalid email or name) the form simply returns blank, without indicating what the user did wrong. How can I display those validationerrors to the user? Much appreciated!



from Flask wtforms ValidationError not displayed to user

No comments:

Post a Comment