Django
[BlogApp] 태그 기능 개발
eunyeong
2022. 1. 24. 11:32
● 설치
pip install django-taggit
pip install django-taggit-templatetags2
# mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'bookmark.apps.BookmarkServiceConfig',
'blog.apps.BlogConfig',
'taggit.apps.TaggitAppConfig', # 추가
'taggit_templatetags2', # 추가
]
# mysite/settings.py
TAGGIT_CASE_INSENSITIVE = True
TAGGIT_LIMIT = 50 # 태그 클라우드에 나타나는 태그의 최대 개수
# blog/models.py
class Post(models.Model):
title = models.CharField(verbose_name='TITLE', max_length=50)
slug = models.SlugField('SLUG', unique=True, allow_unicode=True, help_text='one word for title alias')
description = models.CharField('DESCRIPTION', max_length=100, blank=True, help_text='simple description text')
content = models.TextField('CONTENT')
created_dt = models.DateTimeField('CREATE DATE', auto_now_add=True)
modify_dt = models.DateTimeField('MODIFY DATE', auto_now=True)
tags = TaggableManager(blank=True) # 추가
● taggit 패키지에는 자체 테이블이 정의되어 있어서 tags 컬럼만 추가되는게 아니라 Tag 테이블(Admin 페이지에서 안보임)과 TaggedItem 테이블(Admin 페이지에서 보임)도 함께 추가됩니다.
# blog/admin.py
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'modify_dt', 'tag_list')
list_filter = ('modify_dt',)
search_fields = ('title', 'content')
prepopulated_fields = {'slug' : ('title',)}
def get_quertset(self, request):
return super().get_queryset(request).prefetch_related('tags')
def tag_list(self, obj):
return ', '.join(o.name for o in obj.tags.all())
● def tag_list(self, obj):
return ', '.join(o.name for o in obj.tags.all())
각 태그에는 name 필드가 있고 그 값들을 보여줍니다. 이 정의한 메소드를 list_display에 등록해줍니다.
● def get_quertset(self, request):
return super().get_queryset(request).prefetch_related('tags')
Post 테이블과 Tag 테이블이 ManyToMany 관계이므로, Tag 테이블의 관련 레코드를 한번의 쿼리로 미리 가져옵니다. n:n 관계에서 쿼리 횟수를 줄려 성능을 높이고자 할 때 prefetch_related() 메소드를 사용합니다.