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オブジェクトを引数にして呼び出す。これだけで、前回と同じような画面が表示される。

う〜ん、かなり便利。でも、日本語が化けて使えない。