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を参照。