Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flask-WTFform: Flash does not display errors

I'm trying to flash WTForm validation errors. I found this snippet and slightly modified it:

 def flash_errors(form):
    """Flashes form errors"""
    for field, errors in form.errors.items():
        for error in errors:
            flash(u"Error in the %s field - %s" % (
                getattr(form, field).label.text,
                error
            ), 'error')

Here is one of my form classes:

class ContactForm(Form):
    """Contact form"""
    # pylint: disable=W0232
    # pylint: disable=R0903
    name = TextField(label="Name", validators=[Length(max=35), Required()])
    email = EmailField(label="Email address",
                       validators=[Length(min=6, max=120), Email()])
    message = TextAreaField(label="Message",
                            validators=[Length(max=1000), Required()])
    recaptcha = RecaptchaField()

And view:

@app.route("/contact/", methods=("GET", "POST"))
def contact():
    """Contact view"""
    form = ContactForm()
    flash_errors(form)
    if form.validate_on_submit():
        sender = "%s <%s>" % (form.name.data, form.email.data)
        subject = "Message from %s" % form.name.data
        message = form.message.data
        body = render_template('emails/contact.html', sender=sender,
                               message=message)
        email_admin(subject, body)
        flash("Your message has been sent. Thank you!", "success")

    return render_template("contact.html",
                           form=form)

However, no errors are flashed upon validation failures. I know my forms and templates work fine, because my success message flashes when the data is valid. What is wrong?

like image 683
Sean W. Avatar asked Nov 27 '12 13:11

Sean W.


1 Answers

There are no errors yet because you haven't processed the form yet

Try putting the flash_errors on the else of the validate_on_submit method

@app.route("/contact/", methods=("GET", "POST"))
def contact():
    """Contact view"""
    form = ContactForm()
    if form.validate_on_submit():
        sender = "%s <%s>" % (form.name.data, form.email.data)
        subject = "Message from %s" % form.name.data
        message = form.message.data
        body = render_template('emails/contact.html', sender=sender,
                               message=message)
        email_admin(subject, body)
        flash("Your message has been sent. Thank you!", "success")
    else:
        flash_errors(form)

    return render_template("contact.html",
                       form=form)
like image 112
i_4_got Avatar answered Oct 18 '22 14:10

i_4_got