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')
作成したカスタムフィルタライブラリを登録する、って感じで。