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マスターにはなれると思われます。