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() 메소드를 사용합니다.