pyramidでpyramid-deformを使ってみる
前回の記事で簡単なdeform利用はできるようになりました。
pyramidにはpyramid-deformと呼ばれるdeform連携パッケージが存在するので今回はpyramid-deformを利用してのdeform利用を試します。
1. リソースの定義
自分はpython歴が浅いのでpython界で常道なのかは知らないですが、参考にしたサイトの書き方を見る限りpyramidはリソースという関数を定義してそこでリクエストパラメータをrequestオブジェクトに割り当てる事ができるようです。
add_routeの第三引数で定義したform_indexの戻り値がrequestオブジェクトのcontextに代入されます。
// 「/form」へリクエスト発生すると動作する処理 $ vi myform/resources.py def form_index(request): values = { 'name' : '', 'shoe_size' : 0 } if 'name' in request.POST: values['name'] = request.POST['name'] if 'shoe_size' in request.POST: values['shoe_size'] = request.POST['shoe_size'] return values // 上記で定義した「form_index」をadd_routeで関連付 $ vi myform/__init__.py from pyramid.config import Configurator from myform.resources import form_index def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ config = Configurator(settings=settings) config.include('pyramid_jinja2') config.add_static_view('static', 'static', cache_max_age=3600) config.add_route('form_index', '/form', factory=form_index) config.scan() return config.make_wsgi_app()
2 viewの変更
前回作成したviewを以下のように修正します。
・クラスにルーティング設定のデコレータを移動
・save_successにPOSTが成功した場合の処理を定義
・appstructにリクエストデータをスキーマクラスに紐づけする処理を定義
$ vi myform/views.py from pyramid.view import view_config from pyramid_deform import FormView from myform.schema import Person @view_config(route_name='form_index', renderer="templates/form.jinja2") class PageEditView(FormView): schema = Person() buttons = ('save',) form_options = (('formid', 'pyramid-deform'), ('method', 'POST')) def save_success(self, appstruct): context = self.request.context context['name'] = appstruct['name'] context['shoe_size'] = appstruct['shoe_size'] return None def appstruct(self): context = self.request.context return {'name': context['name'], 'shoe_size': context['shoe_size']}
3 templateの変更
contextでデータにアクセスするように修正します。
<html> <head> <title>Projector</title> </head> <body> <h2>Hello Form!</h2> <div >{{ form| safe }}</div> <p>Valid form values: {{context.name}} and {{context.shoe_size}}.</p> </body> </html>
あとはdeformの使い方を調べればある程度のpyramidでのdeformマスターにはなれると思われます。