読者です 読者をやめる 読者になる 読者になる

Django で簡単にタグ機能を実装できる django-taggit が便利

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 で公開してあるので、フォークして修正してプルリクエスト送ればいいですね。最後の手段ですが。