django-taggit を使ってモデルにタグをつけたり、タグでモデルを検索したりが、簡単に実現できました。これだけでも便利なんですけど、django-taggit-templatetags というアプリを使えばさらに便利になります。
というのも、taggit の Tag クラスは、タグが付いているモデルの数を保存するフィールドがありません。タグを人気順に表示したり、タグクラウドを表示する場合、タグが付いているモデルを数える必要があります。面倒ですよね。
django-taggit-templatetags のカスタムタグを使えばそんなの不要。しかも、ビューでタグを取得してテンプレートに渡す必要もありません。
インストールは pip で一発。
pip install django-taggit-templatetags
django-taggit-templatetags も Django アプリなので、settings.py を編集して INSTALLED_APPS に追加しないといけません。
INSTALLED_APPS = (
...
"taggit",
"taggit_templatetags",
...
)
これで準備 OK。
HTML テンプレートに下記コードを書けば、タグを人気順に表示できます。
{% load taggit_extras %}
{% get_taglist as tags %}
<ul>
{% for tag in tags %}
<li>{{ tag }} x {{ tag.num_times }}</li>
{% endfor %}
</ul>
タグクラウドを表示したい場合は、次のように書きます。
{% load taggit_extras %}
{% get_tagcloud as tags %}
<div>
{% for tag in tags %}
<font size={{tag.weight|floatformat:0}}>{{tag}}</font>
{% endfor %}
</div>
django-taggit と django-taggit-templatetags を使うことで、でやりたいことが超簡単に実現できました。毎回集計するためアクセスが増えるにつれて遅くなりそうなので、いずれはタグの部分をキャッシュするなどの対策が必要ですけどね。