TurboGearsをさわってみる 3
前回、HTMLでべた書きしたものを今度はWidgetsで書き直してみる。
まず、controllers.pyを直す。
import logging import cherrypy import turbogears from turbogears import widgets from turbogears import controllers, expose, validate, redirect from pytodo import json log = logging.getLogger("pytodo.controllers") class TaskDataGrid(widgets.DataGrid): fields = [ ("Title", "title"), ("Date", "date") ] class Root(controllers.RootController): @expose(template="pytodo.templates.welcome") def index(self): from model import Task tasks = Task.selectBy() dataGrid = TaskDataGrid() return dict(dataGrid=dataGrid, tasks=tasks)
DataGridクラスを継承して、TaskDataGridクラスを作る。(別に継承しなくていいけどね)
DataGridはオブジェクトの属性をテーブル形式で表示するWidgetsで、fields属性に列ヘッダ名とバインドするオブジェクトの属性名のタプルのリストを代入する。後は、indexメソッドでTaskDataGridのインスタンスを作成して、ディクショナリで戻す。
そして、welcome.kidを以下のように直す。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#" py:extends="'master.kid'"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/> <title>ToDoの一覧</title> <style type="text/css"> table { font-size: small; background-color: White; } th { color: White; background-color: DarkBlue; padding: 2px 20px 2px 20px; } </style> </head> <body> <div id="header"></div> <div id="main_content"> ${dataGrid.display(tasks)} </div> <div id="footer"></div> </body> </html>
前回、書いたTableタグは全部消して、dataGridのdisplayメソッドをtasksオブジェクトを引数にして呼び出す。これだけで、前回と同じような画面が表示される。
う〜ん、かなり便利。でも、日本語が化けて使えない。