Skip to content
Hiroki Nakayama edited this page Jul 21, 2015 · 9 revisions

wtforms, wtforms-tornado, wtforms-alchemy すべてpipでインストール可能

WTForms-Tornado

  • WTForms-tornadoのFormはWTFormsのFormを継承しているだけなのでWTFormsのやりかたでWTForms-Tornadoでも使用可能

## fomの決定

  • wtformsのFormを継承したクラスでフォームを決定する

from wtforms.fields import StringField
from wtforms.validators import input_required, optional
from wtforms_tornado import Form

class MyForm(Form):
     first_name = StringField(u'First Name', validators=[validators.input_required()])
     last_name  = StringField(u'Last Name', validators=[validators.optional()])
  • validatorは自分の使用したいものをここから見つける

## フォームの表示箇所の設定

  • render等でformを適用したいテンプレートに送る
  • テンプレート側では{% form.data %}のようにすることで入力フォーム等が表示される

handler.py

class Handler(tornado.web.RequestHandler):

    def get(self):
        myform = MyForm()
        self.render('index.html', form=myform)

index.html

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<form  action="/" method="post">
{% raw form.first_name%}<br/>
{% raw form.last_name %}
<input type="submit"/>
</body>
</html>

example

sample.py

import os
import sys
my_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.abspath(os.path.join(my_dir, '..')))

import tornado.ioloop
import tornado.web

from wtforms.fields import IntegerField
from wtforms.validators import DataRequired
from wtforms_tornado import Form

class SumForm(Form):
    a = IntegerField(validators=[DataRequired()])
    b = IntegerField(validators=[DataRequired()])

class SumHandler(tornado.web.RequestHandler):

    def get(self):
        sumform = SumForm()
        self.render('test.html', sumform=sumform)

    def post(self):
        form = SumForm(self.request.arguments)
        if form.validate():
            self.write(str(form.data['a'] + form.data['b']))
        else:
            self.set_status(400)
            print("error")
            self.write(form.errors)

application = tornado.web.Application([
    (r"/", SumHandler),],)

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

test.html

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<form  action="/" method="post">
{% module xsrf_form_html() %}
{% raw sumform.a %}<br/>
{% raw sumform.b %}<br/>
<input type="submit"/>
</body>
</html>

WTForms-Alchemy

  • SQL-AlchemyのモデルからWTFormsを使用できるようにしたもの。

Sample

import sqlalchemy as sa
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from wtforms_alchemy import ModelForm

engine = create_engine('sqlite:///:memory:')
Base = declarative_base(engine)
Session = sessionmaker(bind=engine)
session = Session()

class User(Base):
    __tablename__ = 'user'

    id = sa.Column(sa.BigInteger, autoincrement=True, primary_key=True)
    name = sa.Column(sa.Unicode(100), nullable=False)
    email = sa.Column(sa.Unicode(255), nullable=False)

上記のようなモデルが定義されているとき

class UserForm(ModelForm):
    class Meta:
        model = User

ModelFormを継承したUserForm内のメタ引数で「 model = classname 」とすることでキーを除いたフォーム(今回だとname,email)が作成できる。

比較:普通のWTFormsでフォームを作成した場合

class UserForm(Form):
    name = TextField(validators=[DataRequired(), Length(max=100)])
    email = TextField(validators=[DataRequired(), Length(max=255)])

## 今回使用する場合は・・・

  • 2つを組み合わせて使う事例はない → どちらか一方を使用する
  • WTForms-AlchemyではTornadoで使う場合Templateに送るFormをTornado用に変換する必要がある * WTForms-Tornadoはモデルから作成できないだけで特に欠点はない

Validation関係

wtforms-flaskでのvalidationだが参考になる。

validationに関する公式ドキュメント

validateメソッドのオーバーライドについて

### 参考

WTForms Document :https://wtforms.readthedocs.org/en/latest/index.html

WTForms-Tornadoリポジトリ:https://github.com/puentesarrin/wtforms-tornado

WTForms-Alchemy Document: https://wtforms-alchemy.readthedocs.org/en/latest/index.html

WTForms-tornadoについて記述があるブログ: http://www.mzoo.org/a-very-simple-tornado-wtform-example-using-wtforms_tornado/

WTFormsのオプション等が分かりやすくまとめられているサイト

wtforms-alchemyの公式ドキュメント

wtformsの公式ドキュメント

wtformsでhtmlの属性を変更する方法

wtformsのvalidationで特定したエラーメッセージの表示方法