[Python][TurboGears] TurboGearsでBlog作ってみる その5 カスタムウィジェット

その4では既にあるウィジェットを組み合わせて新しいウィジェットを作った。
しかし、既にあるウィジェットだけでことが足りるわけではない。
最終的に生成されるXHTMLをコントロールするには、turbogears.wigets.Wdigetクラスを継承して、カスタムウィジェットを定義する。

Blog を表示する機能は多くのページで使用する。
BlogWidgetを作成して、再利用しよう。
そして作ったのが以下にあります。

class BlogWidget(widgets.Widget):
    params = ['showDescription']
    def __init__(self, showDescription=True):
        self.showDescription = showDescription
    template = unicode('''<div xmlns="http://www.w3.org/1999/xhtml"
    xmlns:py="http://purl.org/kid/ns#"
    class="blog" id="blog-${value.id}">
    <span class="blog-date" py:content="value.date.strftime('%Y/%m/%d')">YYYY/MM/DD</span>
    <span class="blog-title" py:content="value.title">Blog Title</span>
    <div class="blog-description" py:content="value.description" py:if="showDescription">Blog Description</div>
    <div class="blog-control">
    <a href="editBlog?id=${value.id}" py:if="value.author == tg.identity.user">編集</a>
    <a href="deleteBlog?id=${value.id}" py:if="value.author == tg.identity.user">削除</a>
    </div>
    </div>
    ''', 'utf-8')

クラス変数templateがポイント。
これ、kidテンプレートを直接書いてもいいし、kidテンプレートファイルを指定してもいい。
内部では、なにやら1文字めが<かどうかで処理を分けているご様子。
実際に呼び出すときは、displayメソッドを使うが、その第一引数がvalueという名前で参照可能。
ここでは、Blogオブジェクトが渡されることを前提としている。
また、追加で参照したいインスタンスメンバはparamクラス変数に名前を追加する。
本文を出さない使い方もある(トップページの最新ブログリストなど)ので、オプション引数として、showDescription を使えるようにしている。

使い方はこんな感じ

<div py:for="blog in blogs" py:replace="blogWidget.display(blog)"/>