GoogleAppEngine上のDjangoでカスタムフィルタを作成する

Google App Engine(for Python)上のテンプレートシステムDjangoでカスタムフィルタを作成する為の手順をメモ。
Djangoで「はてなブックマーク数の画像を表示するためのimgタグをURLから生成」みたいなことをしようとするとテンプレート側で処理した方がすっきりしていいですね。テンプレートに渡す変数も少なくて済みます。

テンプレート側(こんな感じで使えるようになります)

{{ url|imgtag_hatebu }}

たとえばurlが「http://d.hatena.ne.jp/ashitano244」とすると、
自作したimgtag_hatebuフィルタを通すことで

<img src="http://b.hatena.ne.jp/entry/image/large/http://d.hatena.ne.jp/ashitano244"/>

と置換されて出力されます。便利。これわざわざプログラム側で変換してテンプレートに渡すとか面倒だしカコワルイ。

カスタムフィルタ側のコード(custom_filters.py)

# -*- coding: utf-8 -*-

from google.appengine.ext import webapp
register = webapp.template.create_template_register()

# はてブ画像のimgタグを生成
def imgtag_hatebu (value):
  return '<img src="http://b.hatena.ne.jp/entry/image/large/' + value.replace('#','%23') + '"/>'

# faviconのimgタグを生成
def imgtag_favicon (value):
  return '<img src="http://favicon.hatena.ne.jp/?url=' + value.replace('#','%23') + '"/>'

# twib画像のimgタグを生成
def imgtag_twib (value):
  return '<img src="http://image.twib.jp/counter/' + value + '"/>'

register.filter(imgtag_hatebu)
register.filter(imgtag_favicon)
register.filter(imgtag_twib)

コード全部記載。3つほどフィルタを作成してみました。どれも同じようなものだけど。
引数valueはテンプレート側から指定されます。ここでいうと「url」が引数に格納されるということになります。あとは適当に加工してreturnして終わり。はてブ数の画像なんかはURL中の「#」を「%23」に置換する必要がありますね。
最後に作成した関数をregister.filterで登録しておしまい。

ちなみにvalueの他に引数を渡すようなフィルタも作成できるらしい。もはや適当な例しか思いつきません。

# valueからargを無くす
def replace(value, arg):
  return value.replace(arg, '')

register.filter(replace)

こうやって使う

{{ url|replace:"hoge" }}

プログラム側のコード(index.pyとか)

from google.appengine.ext import webapp

webapp.template.register_template_library('custom_filters')

作成したカスタムフィルタライブラリを登録する、って感じで。