文字列を端折って表示するカスタムテンプレートフィルタ。

 参考:Python プログラマのための Django テンプレート言語ガイド(ymasuda.jp)

 Djangoのテンプレートシステムも比較的簡単に拡張可能で俺様フィルタやタグを作る事ができる。らしいので、練習として今回は渡された文字列を渡された文字数(←省略可)で収まる様に中抜きして表示するフィルタを作ってみた。こういうのはModelに組み込んでしまうのが常だったのですけど、気にせず参ります。

 アプリケーションフォルダ内に“templatetags”というフォルダをつくり、“__init__.py”と“blog_extras.py”というファイルを作る。__init__.pyは空のままでフィルタはblog_extras.pyの方に記述する。またblog_extrasの部分はロード時に指定する名前となる。

 フィルタは二つの引数を取り、最初の引数に元の文字列、次の引数lengthには表示したい文字数の数値を渡す。lenghtは省略可能でその場合は15になる。また、10以下の数値が渡された場合は10と置き換える。元の文字列の文字数がlengthより短い場合は何もしない。
 省略の方法は、lengthの約2/3まで元の文字列を最初から表示し、残りの約1/3は終端の方の文字列を表示する。前方と後方の文字列の間には“…”を表示する。
 blog_extras.pyの内容は以下の通り。

# coding: utf-8
from django import template

register = template.Library()

@register.filter(name='omit')
def omit(value, length=15):
    s = unicode(value, 'utf-8')
    if length < 10:
        length = 10

    if len(s) > length:
        back_length = length // 3
        temp = s[:length-back_length]
        temp += "…" + s[len(s)-(back_length-1):]
        s = temp
    return s

 テンプレート(←DjangoでのMVCでいうところのView。ちなみに、ModelはModelだけども、ControllerがViewだったりするので知らない人と話す時には気を付けないと誤解を生む)内で以下の様に記述して利用する。

{% load blog_extras %}

{{ 元の文字列|omit:数値 }}

 何か標準的な名前の付け方みたいなのを全然掴んでなくて、まぁ、掴んでいても同じくらいいバラバラで見苦しくなると思うのだけども気が付かなかった事にして公開。次はカスタムテンプレートタグかな。ネタが浮かばないけど。