장고 - Tag 기능 학습

ex) wps_blog

1. django-tagging 모듈 설치

$ pip install django-tagging

2. 모델에 TagField 설정

  • 경로 : 앱 > models.py
    1
    2
    3
    4
    from django.db import models
    from tagging.fields import TagField
    class Post(models.Model):
    tag = TagField(blank=True)

3. INSTALLED_APPS에 ‘tagging’ 추가

  • 경로 : config(프로젝트 명) > settings.py
    1
    2
    3
    4
    INSTALLED_APPS = [
    ...,
    'tagging',
    ]

4. 뷰 코드 작성

  • 경로 : post(앱 이름) > views.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class PostDetail(DetailView):
    model = Post
    template_name = 'post/post_detail.html'
    # 해당 태그가 속해있는 객체 리스트로 이동하는 뷰 코드
    from tagging.views import TaggedObjectList
    class PostTaggedObjectList(TaggedObjectList):
    model = Post
    allow_empty = True
    template_name = 'post/post_list.html'

    # 모든 태그 리스트 조회할 수 있는 페이지로 이동하는 뷰 코드
    from django.views.generic import TemplateView
    class TagList(TemplateView):
    template_name = 'post/tag_list.html'

5. url 지정

  • 경로 : post > urls.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from django.urls import path
    from .views import *

    app_name = 'post'

    urlpatterns = [
    ...
    path('tags/<tag>/', PostTaggedObjectList.as_view(), name='post_taggedlist'),
    path('tags/', TagList.as_view(), name='tag_list'),
    ...
    ]

6. 템플릿 코드 작성

  • 경로 : post > templates > post > tag_list.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    {% extends 'base.html' %}

    {% block title %}Tag List{% endblock %}

    {% block content %}

    {% load tagging_tags%}

    {% tag_cloud_for_model post.Post as post_tags with steps=9 min_count=1 distribution=log %}
    {% for tag in post_tags %}
    <!-- 같은 태그 많을 수록 태그 명 사이즈 증대되게 하는 코드 -->
    <a href="{% url 'post:post_taggedlist' tag.name %}" style="font-size:{{tag.font_size}}em;">{{tag}}</a>
    {% endfor %}

    {% endblock %}
  • 경로 : post > templates > post > post_detail.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    {% extends 'base.html' %}

    {% block title %}
    {{object.title|truncatechars:15}}
    {% endblock %}

    {% block content %}
    <div class="row mt-3">
    <div class="col"></div>
    <div class="col-8">
    <div class="alert alert-info">{{object.title}} - {{object.created}}</div>
    {{object.text|safe}}
    <!-- 커스텀 Tag값을 호출하기 위해 해당 모듈 호출 -->
    {% load tagging_tags %}
    <!-- object 객체에 포함된 tag들을 추출하여 그 객체를 tags로 변경 -->
    {% tags_for_object object as tags %}
    {% if tags %}
    Tags :
    {% for tag in tags %}
    <a href="{% url 'post:post_taggedlist' tag.name %}">#{{tag.name}}</a>
    {% endfor %}
    {% endif %}
    </div>
    <div class="col"></div>
    </div>
    {% endblock %}