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と紐付けられたタグを表示できるようになったはずです。僕はできました。