Skip to content

Form Validation

Validation ensures:

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

Common validators

WTForms ships many validators:

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

Example:

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

Validation errors

When validation fails, errors are stored per field:

  • form.username.errorsform.username.errors

You can show them in templates:

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

Custom validation

You can add custom validation methods:

class RegisterForm(FlaskForm):
    username = StringField("Username", validators=[DataRequired()])
 
    def validate_username(self, field):
        if " " in field.data:
            raise ValidationError("Username cannot contain spaces")
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.

๐Ÿงช Try It Yourself

Exercise 1 โ€“ Create a Flask App

Exercise 2 โ€“ Dynamic Route

Exercise 3 โ€“ Return JSON

If this helped you, consider buying me a coffee โ˜•

Buy me a coffee

Was this page helpful?

Let us know how we did