Класс Form
Класс Form из библиотеки Flask-WTF используется
для описания HTML-форм через Python-классы. Каждое поле
формы задаётся атрибутом класса, а валидаторы
передаются в конструктор поля. Экземпляр формы
создаётся при обработке запроса, автоматически
наполняется данными из request.form и может
проверяться методом validate_on_submit.
Параметром формы обычно выступает объект запроса,
который передаётся первым аргументом.
Синтаксис
from flask_wtf import FlaskForm
class FormName(FlaskForm):
field_name = FieldType(validators=[...])
Пример
Давайте опишем простую форму с одним полем
name и выведем её в шаблоне:
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SECRET_KEY'] = 'abcde'
class UserForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
submit = SubmitField('Send')
@app.route('/', methods=['GET', 'POST'])
def index():
form = UserForm()
if form.validate_on_submit():
return 'hello ' + form.name.data
return render_template('index.html', form=form)
Шаблон для вывода формы:
<form method="post">
{{ form.hidden_tag() }}
<p>{{ form.name.label }} {{ form.name() }}</p>
<p>{{ form.submit() }}</p>
</form>
Результат выполнения кода при отправке значения
'abcde':
hello abcde
Пример
Давайте добавим валидатор длины и выведем ошибки в шаблоне:
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired, Length
app = Flask(__name__)
app.config['SECRET_KEY'] = 'abcde'
class UserForm(FlaskForm):
name = StringField('Name', validators=[DataRequired(), Length(min=3, max=10)])
submit = SubmitField('Send')
@app.route('/', methods=['GET', 'POST'])
def index():
form = UserForm()
if form.validate_on_submit():
return 'user ' + form.name.data
return render_template('index.html', form=form)
Шаблон с выводом ошибок:
<form method="post">
{{ form.hidden_tag() }}
<p>{{ form.name.label }} {{ form.name() }}</p>
{% for error in form.name.errors %}
<p>{{ error }}</p>
{% endfor %}
<p>{{ form.submit() }}</p>
</form>
Результат выполнения кода при отправке значения
'ab':
Field must be at least 3 characters long.
Смотрите также
-
метод
validate_on_submit,
который проверяет отправку и валидность формы -
метод
validate,
который проверяет валидность формы -
метод
populate_obj,
который переносит данные формы в объект -
атрибут
errors,
который хранит ошибки валидации полей