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'} >>>