-
Notifications
You must be signed in to change notification settings - Fork 4
WTforms
wtforms, wtforms-tornado, wtforms-alchemy すべてpipでインストール可能
- 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 %}のようにすることで入力フォーム等が表示される
class Handler(tornado.web.RequestHandler):
def get(self):
myform = MyForm()
self.render('index.html', form=myform)
<!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>
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()
<!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>
- SQL-AlchemyのモデルからWTFormsを使用できるようにしたもの。
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はモデルから作成できないだけで特に欠点はない
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の属性を変更する方法
- http://stackoverflow.com/questions/6456744/wtforms-display-property-value-instead-of-html-field
- http://stackoverflow.com/questions/11309779/wtforms-add-a-class-to-a-form-dynamically
wtformsのvalidationで特定したエラーメッセージの表示方法