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とかで作らないとダメかな??