TurboGearsをさわってみる 2

次はタスクの一覧を表示する画面を作る。
まずは、データを流し込む。普通にSQLiteでINSERT文を書いてもいいが、TurboGearsにはブラウザ上からCRUD操作を実行するフォームが用意されているので、それを使う。

以下のコマンドを実行するとブラウザが起動して、TurboGears Toolboxなるものが表示される。

> tg-admin toolbox

CatWalkのリンクをクリックすると、モデルクラスの一覧が表示される。
CRUD操作を実行したいモデルをクリックすると、フォームが表示されるので、適当なデータを流しこむ。(ちなみにIEでは正しく動作しなかった、日本語も使えないみたい)

タスクの検索処理

次にタスクの一覧を検索して、画面に引き渡すところを作る。
こういった処理はコントローラの担当なので、controllers.pyを編集する。

import logging

import cherrypy

import turbogears
from turbogears import controllers, expose, validate, redirect

from pytodo import json

log = logging.getLogger("pytodo.controllers")

class Root(controllers.RootController):
    @expose(template="pytodo.templates.welcome")
    def index(self):
        from model import Task
        tasks = Task.selectBy()
        return dict(tasks=tasks)

コントローラクラスのメソッド名がそのままリクエストURLにマップされる。
indexは、フォルダに対してアクセスされた時に自動的にリダイレクトされるURLにマップされる。(いわゆるindex.html)ビューとの関連付けは、関数デコレータのexposeで指定する。ここでは、welcome.kidにマップされている。

indexメソッドの処理として、

  1. TaskクラスのselectByメソッドでタスクを全件検索する。
  2. 検索結果をディクショナリとして戻す。(これがビューに渡される)

タスクの表示処理

次に、welcome.kidを編集する。kidテンプレートはXHTML形式で作成されている。

<!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">
	<table border="1" rules="all">
		<tr>
			<th>タイトル</th>
			<th>作成日</th>
		</tr>
		<tr py:for="task in tasks">
			<td py:content="task.title">テスト</td>
			<td py:content="task.date">作成日</td>
		</tr>
	</table>
</div>
<div id="footer"></div>
</body>
</html>

とりあえず、単純なテーブルでタスクの一覧を表示する。
タグの属性として、処理を記述するのでブラウザで普通に表示することができる。これは見やすいかな。
py:forはfor文、py:contentはタグの中身を指定したオブジェクトの属性で入れ替える。でも、こういふうにHTMLを記述しなくても、Widgetsを利用すればコンポーネント指向な記述ができるらしい。
次はそれを試してみよう。