リソーステンプレートの適用

今のところ、デモの目的として、内部リクエストにくるのはすべてプレーンテキストを返していました。
これからどのように実物のテンプレートをコントローラーの中に埋め込むのかを見せましょう。
TurboGearsユーザは、マークアップの中の動的コンテンツをコントロールするためにKidテンプレートシステムが利用できます。

あなたのサイトのページ毎に、テンプレートコントローラの中でリソース対応が起こります。
これは特定のテンプレートの引数(turbogears.expose デコレータの引数)で行われます。

@turbogears.expose(template="tutorial.templates.welcome")
def index(self):
    ...

テンプレートは置き換える引数を取ります。テンプレート引数は、変数とほかの動的コンテンツに利用されます。コントローラーからのテンプレート引数は、テンプレート内でアクセス可能な変数(辞書キー)として返すことができます。

@turbogears.expose(template="tutorial.templates.users")
def index(self):
    users = model.User.select()
    return dict(users=users)

すべてのテンプレートが動的コンテンツを持っているとは限りません。それ故、引数が必要でないかもしれません。
このケースでは、空の辞書が返ります。

@turbogears.expose(template="tutorial.templates.welcome")
def index(self):
    return dict()

ここでは、アプリケーションのためにコントローラー修正をします。プレーンテキストの代わりにテンプレートを利用します。

class Users:
    @turbogears.expose(template="tutorial.templates.users")
    def index(self):
        users = model.User.select()
        return dict(users=users)

    @turbogears.expose(template="tutorial.templates.user")
    def default(self, userID):
        try:
            userID = int(userID)
            user = model.User.get(userID)
        except (ValueError, model.SQLObjectNotFound):
            raise cherrypy.NotFound
        else:
            return dict(user=user)

class Root(controllers.RootController):
    users = Users()

    @turbogears.expose(template="tutorial.templates.welcome")
    def index(self):
        return dict()

    @turbogears.expose(template="tutorial.templates.about")
    def about(self, author="Brian Beck"):
        return dict(author=author)
個人的メモ1

当然だけど、UsersクラスをRootクラスの前に書く必要がある。def defaultは適合するメソッド・アトリビュートが該当しなかった場合に呼び出される処理。URLを引数として持つ。例えばhttp://www.example.co.jp/Users/3 はdefaultの第2引数に"3"が入る。

このアプリケーションにアクセスしても、今は動きません。まだいくつかのテンプレートが存在していないし、作成されていないからです。

テンプレートの骨組みを作成します。プロジェクトが作られた時にできたデフォルトのwelcom.kidをコピーして作成します。

$ cp tutorial/templates/welcome.kid tutorial/templates/users.kid
$ cp tutorial/templates/welcome.kid tutorial/templates/user.kid
$ cp tutorial/templates/welcome.kid tutorial/templates/about.kid