FlaskでWTFormsを使う

FlaskにはFormがないため、WTFormsをつかってみた。
ほとんど以下のドキュメント・ブログを見ればわかる気もするが、自分用にメモ。

本家ドキュメント
http://wtforms.simplecodes.com/docs/1.0.4/index.html

参考ブログ(大変参考になりました)
http://tnakamura.hatenablog.com/entry/20110811/wtforms


from wtforms import Form, TextField
from wtforms.validators import Required, Length

class TestForm(Form):
    #フォームごとに変数を作っておく
    content = TextField(u'content', validators=[\
            #各validatorsには入力制限に引っかかった際に表示
            #するエラーメッセージとかを定義しておく
            Required(u'入力してください'),\
            Length(min=1, max=30, message=u'30文字以内で入力してください')\
            ])

まず、こんな感じでForm用のクラスを作り、
Formを定義(TextField, HiddenFieldとか)し、引数にvalidator(Required, Lengthとか)をセットする。


@app.route('/hoge', methods=['GET', 'POST'])
def hoge():
    form = TestForm(request.form)
    #入力値の検証(上で定義したvalidator(入力制限)に引っかかると
    #falseが返る)
    if request.method == "POST" and  form.validate():
        map_name = request.form['content']

           #DB処理とか

        return redirect(url_for('hoge'))
    
    return render_template(huga.html', form=form)

これでテンプレートに対してフォームを渡し、
POSTの際には入力チェックを行って処理を行うことができる。


#errorsには、各フォームごとにdictで格納される。
for error_message in form.errors.get('content')
    print error_message

入力制限に引っかかった際のエラーメッセージは、errorsプロパティから参照できる。


#huga.html

<form id="form1" action="{{url_for('hoge')}}" method="post">
{{ form.content() }}
</form>

テンプレートの方にはこんな感じでフォームを追加する。
追加したフォームのidとnameには、クラスに定義した変数名(今回で言えばcontent)がセットされる。
※classとか追加するためには、html側で動的に属性を追加してあげなきゃダメみたい……(それともなんかやり方がある?)



〜ちょっとわかんなかったところ〜
Validatorの種類にURLとかあるんだけど、これ使うと入力必須になっちゃう。Regexpとかで作らないとダメかな??