Djangoで、タグ付けをuuidとともに使う

Djangoで、投稿などにタグを付けたいと思うことがよくあると思います。また、それぞれの投稿にuuidを付けてる場合もあると思います。そんなときに簡単にタグを付けられるプラグインが、”django-taggit“というプラグインになります。
公式ドキュメントはこちら

使い方

pipを使ってインストールします。

 $ pip install django-taggi

次に、settings.pyの中のINSTALLED_APPSにtaggitを追加します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    ~~~~~~~,
    'taggit'    #追加します
]

モデルにタグのフィールドを持たせます。TaggableManagerをインポートした上で、models.pyなどに作成したモデルに、タグ用のフィールドを追加します。今回はtagsという名前を使っています。

from django.db import models
from taggit.managers import TaggableManager

class model(models.Model):
    # ... fields here
    tags = TaggableManager()

そして、migrateをします。

$ ./manage.py migrate

これだけで、普通にIDを持たせているモデルに対しては、タグを付けることができます。
forms.ModelFormなどで入力をしている場合は、fieldsに’tag’を追加するだけでフォーム入力が可能になります。
また、すべてのタグは “tags.all()”で取得できます。templateでモデルに属するタグをすべて表示する場合は、以下のようになります。

{% for tag in model.tags.all %}
<li>{{ tag }}</li>
{% endfor %}

さて、ここからが本題です。uuid.uuid4()などでidを持たせて、pk(primary key)として利用している場合は、上記の設定だとうまくタグが表示されません。それを可能にするためには、UUIDにタグ付けされたアイテムのクラスを作り、それを経由させる必要があります。上記のモデルを書き換えて、以下のようにしてください。

class UUIDTaggedItem(GenericUUIDTaggedItemBase, TaggedItemBase):
    class Meta:
        verbose_name = _("Tag")
        verbose_name_plural = _("Tags")

class model(models.Model):
    # ... fields here
    tags = TaggableManager()

これでuuidと紐付けられたタグを表示できるようになったはずです。僕はできました。

Back to Top