Spec-Zone.ru › Flask 2.2

Формирование форм с 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.

© 2010 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/stable/patterns/wtforms/

Spec-Zone.ru

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