Skip to content

Form Validation

Validation ensures:

  • required fields are present
  • values match expected patterns (email)
  • lengths/ranges are safe

WTForms ships many validators:

  • DataRequired() / InputRequired()
  • Email()
  • Length(min=, max=)
  • NumberRange(min=, max=)
  • Regexp()

Example:

python
from wtforms.validators import DataRequired, Length
 
username = StringField("Username", validators=[DataRequired(), Length(min=3, max=20)])

When validation fails, errors are stored per field:

  • form.username.errors

You can show them in templates:

html
{% for error in form.username.errors %}
  <p class="error">{{ error }}</p>
{% endfor %}

You can add custom validation methods:

python
class RegisterForm(FlaskForm):
    username = StringField("Username", validators=[DataRequired()])
 
    def validate_username(self, field):
        if " " in field.data:
            raise ValidationError("Username cannot contain spaces")

Custom validators are great for business rules.

Here’s the Post/Redirect/Get pattern that keeps form submissions safe from accidental resubmission.

diagram Post/Redirect/Get pattern mermaid
Form validation flow with re-render on errors and redirect on success

pch.coffeeTagline

pch.coffeeCta

pch.feedbackHeading

pch.feedbackSubheading