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 coffeeWas this page helpful?
Let us know how we did
