Spec-Zone.ru › Flask 2.3

Валидация форм с WTForms

Когда приходится работать с данными форм, отправляемыми браузером, код быстро становится трудночитаемым. Существуют библиотеки, призванные упростить этот процесс. Одна из них — WTForms, которую мы рассмотрим здесь. Если у вас много форм, стоит попробовать её.

При работе с WTForms нужно сначала определить формы как классы. Рекомендуется разбить приложение на несколько модулей (Большие приложения как пакеты) и добавить отдельный модуль для форм.

Максимальное использование WTForms с расширением

Расширение Flask-WTF расширяет эту модель и добавляет несколько полезных инструментов, которые делают работу с формами и Flask более приятной. Его можно получить из PyPI.

Формы

Это пример формы для типичной страницы регистрации:

from wtforms import Form, BooleanField, StringField, PasswordField, validators

class RegistrationForm(Form):
    username = StringField('Username', [validators.Length(min=4, max=25)])
    email = StringField('Email Address', [validators.Length(min=6, max=35)])
    password = PasswordField('New Password', [
        validators.DataRequired(),
        validators.EqualTo('confirm', message='Passwords must match')
    ])
    confirm = PasswordField('Repeat Password')
    accept_tos = BooleanField('I accept the TOS', [validators.DataRequired()])

В представлении

В функции представления использование этой формы выглядит так:

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm(request.form)
    if request.method == 'POST' and form.validate():
        user = User(form.username.data, form.email.data,
                    form.password.data)
        db_session.add(user)
        flash('Thanks for registering')
        return redirect(url_for('login'))
    return render_template('register.html', form=form)

Обратите внимание, что здесь подразумевается использование SQLAlchemy (SQLAlchemy в Flask), но это не обязательно. Измените код по необходимости.

Следует помнить:

  1. создать форму из запроса form значение, если данные отправляются через HTTP POST метод и args если данные отправляются как GET.
  2. для валидации данных вызовите метод validate(), который вернёт True если данные валидны, False в противном случае.
  3. для доступа к отдельным значениям из формы, обратитесь к form.<NAME>.data.

Формы в шаблонах

Теперь о стороне шаблонов. Когда вы передаёте форму в шаблоны, вы можете легко их отобразить. Посмотрите пример шаблона, чтобы увидеть, насколько это просто. WTForms уже выполняет половину генерации формы за вас. Чтобы сделать это ещё лучше, можно написать макрос, который отображает поле с меткой и списком ошибок, если они есть.

Вот пример _formhelpers.html шаблона с таким макросом:

{% macro render_field(field) %}
  <dt>{{ field.label }}
  <dd>{{ field(**kwargs)|safe }}
  {% if field.errors %}
    <ul class=errors>
    {% for error in field.errors %}
      <li>{{ error }}</li>
    {% endfor %}
    </ul>
  {% endif %}
  </dd>
{% endmacro %}

Этот макрос принимает несколько ключевых аргументов, которые передаются в функцию поля WTForm, которая отображает поле за нас. Ключевые аргументы будут вставлены в качестве HTML атрибутов. Таким образом, например, вы можете вызвать render_field(form.username, class='username') чтобы добавить класс к элементу ввода. Обратите внимание, что WTForms возвращает стандартные строки Python, поэтому нам нужно сказать Jinja2, что эти данные уже обработаны как HTML-сущности с помощью фильтра |safe.

Вот register.html шаблон для функции, которую мы использовали выше, который использует _formhelpers.html шаблон:

{% from "_formhelpers.html" import render_field %}
<form method=post>
  <dl>
    {{ render_field(form.username) }}
    {{ render_field(form.email) }}
    {{ render_field(form.password) }}
    {{ render_field(form.confirm) }}
    {{ render_field(form.accept_tos) }}
  </dl>
  <p><input type=submit value=Register>
</form>

Для получения дополнительной информации о WTForms посетите сайт WTForms.

© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/2.3.x/patterns/wtforms/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API