DjangoでテンプレートエンジンにGenshiを使うメモ
Djangoの特徴として、テンプレートエンジンをDjango純正のものも含めて自由に選択できることがあります。
デフォルトのテンプレートエンジンはRailsやJSPに近い感じでスクリプトとHTMLが混在するようなタイプです。したがって、デザイナとプログラマの分離がやや難しいく、デザインまでプログラマがこなす場合に向いています。他の選択肢としては、幾つかあるのですがTracで有名なedgewallの開発しているテンプレートエンジンにGenshi(原糸)というのがあります。Genshiは最新版のTracでも用いられているテンプレートエンジンで、XML(XHTML)がベースとなります。
今回はチュートリアルやマニュアルから、簡単に使い方を解説してみようと思います。
http://genshi.edgewall.org/
インストール
インストールは、easy_installを導入していれば、以下のコマンドを実行すればOKです。
easy_install Genshi
テンプレートの作成
テンプレートはXML(XHTML)で記述します。文字コードはUTF-8にする方が無難でしょう。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude" lang="jp" > <head> <title>Genshi</title> </head> <body > <div> <h1>${head_line}</h1> <ul py:for="msg in messages"> <li>${msg}</li> </ul> </div> </body> </html>
通常のXHTMLとして記述すればOKですが、genshiの機能を使う為の名前空間がhtml宣言で宣言されています。テンプレートはDjangoのテンプレートディレクトリに配置してください。
ポイントはulタグでの繰り返し処理のコードがpy:forというXHTMLの属性で記述されていることです。簡単に予想できるように、このテンプレートのul部分はmessagesを用いてイテレートされ、liタグが繰り返し出力されます。
尚、最近使用したフレームワークでJava(JSF)のTeedaがありますが、Teedaではタグの種類とidの命名規則から振る舞いが決まりました。例えば、同様の処理を行うテンプレートはこんな感じになります。
<ul id="messageItems"> <li><span id="msg"></span></li> </ul>
繰り返し処理を行うタグを使いliタグを囲むパターンが多いのですが、やはり余計なタグがあるよりもない方がスッキリしませんか?
viewから使う
Djangoのデフォルトのテンプレートローダーを使えば、次のようなコードで簡単にGenshiを使うことができます。
from django.http import HttpResponse from django.template import loader from genshi.template import MarkupTemplate def index(request): source, origin = loader.find_template_source('index.html'); template = MarkupTemplate(source) doc = template.generate(head_line='Hello Genshi', messages=['A', 'B']) return HttpResponse(doc.render('xhtml'))
ポイントというほどでもないですが、genshi.template.MarkupTemplateを使用してテンプレートを作成し、renderメソッドでXHTMLに変換するだけです。