Web アプリケーションにタグ機能を実装したくて、いい Django アプリケーションがないか探したみたら、django-tagging っやつが真っ先に挙がってきました。でも、あまり評判よくないっぽい?
さらに調べてみたら django-taggit というのも発見。日本語の情報が見当たらないですけど、海外の評判は良さそうでした。
ドキュメントもしっかり書かれているのが好印象。
今回は taggit を採用することに。
インストールは pip で一発。
pip install django-taggit
django-taggit は Django アプリケーションなので、settings.py の INSTALLED_APPS に追加する必要があります。
INSTALLED_APPS = (
...
'taggit',
...
)
あとはタグを付けたいモデルに TaggableManager フィールドを追加すれば OK。
from django.db import models from django.contrib.auth.models import User from taggit.managers import TaggableManager class Entry(models.Model): user = models.ForienKey(User) title = models.CharField(max_length=200) content = models.CharField(max_length=800) tags = TaggableManager() # タグ用フィールド created = models.DateTimeField(auto_now_add=True)
簡単ですね。
モデルにつけられたタグを取得するには、TaggableManager の all メソッドを使います。
entry = Entry.objects.get(pk=1) tags = entry.tags.all()
名前に Manager が付いているくせに、Manager クラスを継承しているわけじゃない、というのがややこしいです。名前は TagField に改名した方がいいと思うんですが…。大した問題じゃない?
クエリを使うとき、通常のフィールドと同じように、タグのフィールドにもフィルタを指定できます。
def get_entries_by_tag(tag_name): return Entry.objects.filter(tags__name__in=[tag_name])
Django 標準のフィールドと同じように使えるのはポイント高いです。API の使いやすさが、django-taggit を選んだ一番の理由かな。
なんと、django-taggit は ModelForm にも対応しています。
from django.forms import ModelForm from sample.models import Entry class EntryForm(ModelForm): class Meta: model = Entry exclude = ("user", "created")
from django.core.urlresolvers import reverse from django.shortcuts import render_to_response, redirect from sample.forms import EntryForm from sample.models import Entry @login_required def new_entry(request): form = EntryForm(request.POST) if request.method == "POST" and form.is_valid(): entry = form.save(commit=False) entry.user = request.user entry.save() form.save_m2m() return redirect(reverse("list_entry")) return render_to_response("entry_new.html", { "form": form })
ユーザーが入力したタグの書式が正しいかどうか、検証するコードを自分で書かずに済むので助かります。
django-taggit は使いやすい Django アプリケーションだと思います。API が Django っぽい。これ重要。Django っぽいということは、ドキュメントを読まなくても、使い方がだいたい推測できるわけですから。
django-taggig の開発は落ち着いているみたいですけど、今のところ問題には遭遇していません。まだガッツリ使ってないからかもしれませんがね。もし放置されてるバグに遭遇した場合、GitHub で公開してあるので、フォークして修正してプルリクエスト送ればいいですね。最後の手段ですが。