学んだことをメモする日記

主にpythonについて自分が学んだことについてのメモ帳。理解が深まればいいんだけれども・・・

WTFormsを学ぶ その1

PythonのWebアプリケーションフレームワークであるFlaskで遊んでみたいと思い、いじってる途中でフォームについても何かあるかなと思い調べたら、WTFormsという拡張機能があるみたいなので調べてみた。
Form Validation with WTForms — Flask 0.9-dev documentation

インストールに関しては

pip install Flask-WTF

とすれば出来る。

また、自分はDotcloudの環境で利用しようとしてたので、requirements.txtに

Flask-WTF

と追記したらインストールしてくれた。ちなみにバージョンは2012/5/15現在は1.0?。

簡単な例

上記リンク先のドキュメントの例

フォームの設定
from wtforms import Form, BooleanField, PasswordField, TextField, validators

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

コードから分かる通り、文字数や入力の有無、また、入力値の再入力チェックが簡単に設定できるっぽい。

ルーティングの設定
@app.route('/register', methods=['GET', 'POST'])
def register():
    form = Registration(request.form)
    if request.method == 'POST' and form.validate():
        user = User(form.username.data, form.email.data,
                    form.password.data)
        return redirect(url_for('login'))
    return render_template('register.html', form=form)

ここではPOSTリクエストを受け取ったときの処理を書いてある。form.validate()は上記のフォームの設定で行なった条件を満たしていればTrueとなる。また、受け取ったフォームの情報はform.username.dataで受け取れるみたい。

フォームのテンプレート

最初にフォーム用のフィールドとラベルの表示用のマクロを作る。ドキュメントでは_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 %}
>|html|
このマクロを設定することによって、フォームや入力不備時の表示のされ方のデザインを決めることが出来る。ドキュメントには色々書いてあるけど、読むのメンドーだから放置。で、次にフォーム自体のテンプレートをregister.htmlという名前で作成する。
>||
{% from "_formhelpers.html" import render_field %}
<form method=post action="/register">
  <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>

これのrender_fieldの部分が上記のマクロで設定したレイアウトで挿入される。
とりあえず基本的なことはこれでできるのかな?

もっと複雑なことをしたい場合はWTForms Documentationを参照。

続く。
WTFormsを学ぶ その2 - 学んだことをメモする日記