2013年7月4日木曜日

WTFormsで動的にフォームを作成する

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()

こんな感じです

バリデーションも動いてます、ちょっと上手くいかなかったのがDjangoのCheckboxSelectMultiple的なものが無いかと調べてはみたもののいまいちでした。WTFormsだとCheckboxSelectMultipleとかでやるのか?ちょっと調べてみます。



0 件のコメント:

コメントを投稿