Pylons+memcacheDB...編集

次は編集フォームと、そのコントローラを記述。

まずコントローラphone.pyに以下のメソッドを追加

    def edit(self, id = None):
        if id is None:
            abort(404)

        ser = self.mc.get(id.encode('ascii'))

        if ser is None:
            abort(404)

        u = jsonpickle.Unpickler()
        phone = u.restore(ser)

        if not isinstance(phone, model.Phone):
            abort(404)

        values = {
            'mobile_number': phone.mobile_number,
            'name': phone.name,
            'address': phone.address,
            'home_number': phone.home_number,
            'dob': phone.dob}

        c.title = phone.name
        return htmlfill.render(render('/derived/phone/edit.html'), values)


    @restrict('POST')
    @validate(schema = NewPhoneForm(), form = 'edit')
    def save(self, id = None):
        if id is None:
            abort(404)

        ser = self.mc.get(id.encode('ascii'))

        if ser is None:
            abort(404)

        u = jsonpickle.Unpickler()
        phone = u.restore(ser)

        if not isinstance(phone, model.Phone):
            abort(404)

        for k, v in self.form_result.items():
            if getattr(phone, k) != v:
                setattr(phone, k, v)

        p = jsonpickle.Pickler()
        self.mc.set(phone.id, p.flatten(phone))

        response.status_int = 302
        response.headers['location'] = h.url_for(controller = 'phone',
                                                 action = 'view',
                                                 id = id)
        return "Moved temporarily"

フォームを記述: templates/derived/phone/edit.html

%inherit file="/base/index.html"/>
<%namespace file="fields.html" name="fields" import="*"/>

<%def name="heading()">
  <h1 class="main">Editing ${c.title}</h1>
</%def>

${h.form_start(h.url_for(controller = 'phone', action = 'save', id = request.urlvars['id'\
]), method = "post")}
  ${fields.body()}
  ${h.field(field = h.submit(value = "Save Changes", name="submit"))}
${h.form_end()}

何か新しい電話帳データを作成し、画面下のeditリンクをクリックすると、編集フォームが表示される。

編集後、Saveボタンをクリックすると変更後のデータが反映される。

Python Shellからも確認。

$ python
Python 2.6.4 (r264:75706, Dec 28 2009, 15:52:45)
[GCC 4.3.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import memcache
>>> mc = memcache.Client(['127.0.0.1:21201'], debug = 0)
>>> v = mc.get('8636120904394d85b10b48260f81c4de')
>>> v
{'py/object': 'phonebook.model.Phone', 'name': u'masayang', 'dob': u'19200323', 'mobile_number': u'111-1111-1111', 'address': u'edited address', 'home_number': u'222-2222-2222', '_id': '8636120904394d85b10b48260f81c4de'}
>>>

Gitコミット先