WTFromsで動的にフォームを作成
色々試行錯誤して何とか動的にフォームを作成できたので、その時の備忘録てきなメモ。説明とか面倒なのでコードを記載します
ソースコード
クロージャーで書いてるところがミソで、CreateForm()からどんどん追加していくだけ。IichikoFormCreateクラスへパラメータを渡して、それを利用して色々ゴニョゴニョ設定にそってフォームを作成可能。
と言うことを伝えたいだけです。
# -*- coding: utf-8 -*-
from ReadSomeSetting import ReadSomeSetting
from wtforms import Form, BooleanField, TextField, validators, SelectField, TextAreaField
name_validates = [
validators.Required(message=u"入力してください"),
validators.Length(max=10, message=u"10文字以内で入力してください"),
]
class IichikoFormCreater(object):
def __init__(self, param=None):
super(IichikoFormCreater, self).__init__()
self.param = param
def CreateForm(self, form):
''' form class definition'''
class IichikoForm(Form):
pass
def _createKicchomuField():
setattr(IichikoForm, 'kicchomu',
BooleanField(u'吉四六', default=False))
'''
例えばDBから設定値を読み込み、それにそってFormを作成したりどうなの?
'''
rs = ReadSomeSetting()
self.val = rs.GetSettings(self.param)
IichikoForm.name = TextField(u'なまえ', name_validates)
IichikoForm.kosa = SelectField(u'アルコール濃度', None,
choices=[(0, u'-----'),
(1, u'20度'),
(2, u'25度')], coerce=int, default=1)
if self.val['iichiko_com'] is True:
IichikoForm.comment = TextAreaField(u'いいちこコメント')
_createKicchomuField()
return IichikoForm(form)
ニセ、設定読み込みクラス# -*- coding: utf-8 -*-
class ReadSomeSetting(object):
def __init__(self):
super(ReadSomeSetting, self).__init__()
def GetSettings(self, param=None):
# Do someting
return dict(iichiko_com=True)
flaskで使ってみる
出来たと動くか?と言われたら動かしてみないとわからなのでflaskで動かしてみる、ファイル配置は以下のとおり。
└── iichiko
├── forms
│ ├── IichikoFormCreater.py
│ ├── ReadSomeSetting.py
│ └── __init__.py
├── iichiko.py
├── iichiko.wsgi
├── static
│ ├── script.js
│ └── style.css
└── templates
├── complete.html
├── index.html
└── layout.html
# -*- coding: utf-8 -*-
from flask import Flask, render_template, request
from forms.IichikoFormCreater import IichikoFormCreater
app = Flask(__name__)
app.debug = True
@app.route("/", methods=['GET', 'POST'])
def index():
ii = IichikoFormCreater()
form = ii.CreateForm(request.form)
if request.method == 'POST' and form.validate():
return render_template("complete.html", title=u"たまんない")
else:
return render_template("index.html", title=u"いいちこフォーム", form=form)
if __name__ == '__main__':
app.run()

0 件のコメント:
コメントを投稿