2009年2月26日

tempitaだって継承できちゃうんだから!

つーわけで、WebなMVCのVの部分であるHTMLテンプレートも最近のは継承できて当然!となるんでしょうか。
tempitaを久しぶりに使おうと思ってドキュメントを読んでいたら、inheritなる単語を発見しました。
0.3から継承をサポートするようになったようです。

継承のしかたですが、テンプレート内で、{{inherit テンプレート名}}と書くと、指定したテンプレートをレンダリングします。
その際、元のテンプレート内で、{{def}}で定義したブロックを呼び出すことができます。
元のテンプレート内の{{def}}の外にあるコンテンツは、単に無視されるようです。

index.html

{{inherit "layout.html"}}
{{def main}}
ここがメイン
{{enddef}}


layout.html

<html>
<head>
</head>
<body>
{{self.main | html}}
</body>
</html>

と用意して、index.htmlをtenpita.HTMLTemplateでレンダリングすれば、

<html>
<head>
</head>
<body>
ここがメイン
</body>
</html>

となります。

ところで、デフォルトの親クラスを探す処理が微妙。
この状態で、index.html/layout.htmlを探されても・・・

def get_file_template(name, from_template):
    path = os.path.join(from_template.name, name)
    return from_template.__class__.from_filename(
        path, namespace=from_template.namespace,
        get_template=from_template.get_template)

get_file_template関数があるのですが、元のテンプレートに直接継承テンプレート名を結合してます。

path = os.path.join(from_template.name, name)

以下のように修正。うまくいきました。

path = os.path.join(os.path.dirname(from_template.name), name)

この関数を使うところは、入れ替え可能なので、この内容で関数を作って、tempita.HTMLTemplate.get_templateを差し替えればOKです。