본문 바로가기
Language/파이썬

장고(django) 태그 taggit - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍

by javapp 자바앱 2022. 1. 17.
728x90

 

Getting Started — django-taggit 1.3.0 documentation

Add "taggit" to your project’s INSTALLED_APPS setting. Run ./manage.py migrate. Note If you want django-taggit to be CASE-INSENSITIVE when looking up existing tags, you’ll have to set TAGGIT_CASE_INSENSITIVE (in settings.py or wherever you have your Dj

django-taggit.readthedocs.io

pip install django-taggit

 

 

GitHub - fizista/django-taggit-templatetags2: Templatetags for django-taggit.

Templatetags for django-taggit. Contribute to fizista/django-taggit-templatetags2 development by creating an account on GitHub.

github.com

pip install django-taggit-templatetags2

 

 


 

태그 설정

 

 mysite/settings.py

INSTALLED_APPS = [
    ...
    'taggit.apps.TaggitAppConfig', # 태그 추가
    'taggit_templatetags2',        # 태그 추가
]
# about tag
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

TAGGIT_CASE_INSENSITIVE = True
TAGGIT_LIMIT = 50

 

Model

blog/models.py

class Post(models.Model):
...
    # 6챕 태그 추가
    tags = TaggableManager(blank=True)

포스트 모델에 태그 속성 추가

 

blog/admin.py

from django.contrib import admin
from blog.models import Post

# admin 사이트에 보이도록 작성
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    # list_display = ('id','title','modify_dt')
    list_display = ('id','title','modify_dt','tag_list') # 'tag_list' 추가

    list_filter = ('modify_dt',)
    search_fields = ('title','content') # 검색 박스 표시, title, content 칼럼에서 검색
    prepopulated_fields = {'slug': ('title',)} # title 필드를 사용해 미리 채워지도록

    # add two methods about tag

    # Post 레코드 리스트를 가져오는 메소드 오버라이딩
    # N:N 관계에서 쿼리 횟수를 줄여 성능 높일때 : prefetch_related
    def get_queryset(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())

어드민에 추가

 

데이터 베이스 업데이트

python manage.py makemigrations

python manage.py migrate

 

 

blog/urls.py

# /blog/tag/
# URL 패턴의 이름은 이름공간을 포함해 blog:tag_cloud
path('tag/', views.TagCloudTV.as_view(), name='tag_cloud'),  # TemplateView를 상속받아 정의

# /blog/tag/tagname/
path('tag/<str:tag>/', views.TaggedObjectLV.as_view(), name='tagged_object_list'),  # ListView를 상속받아 정의

URLconf

 

View

blog/views.py

# about tag
class TagCloudTV(TemplateView):
    template_name = 'taggit/taggit_cloud.html'

class TaggedObjectLV(ListView):
    template_name = 'taggit/taggit_post_list.html'
    model = Post                                        # 대상 테이블은 Post 테이블

    def get_queryset(self):
        return Post.objects.filter(tags__name=self.kwargs.get('tag'))

    # tagging/taggit_post_list.html 에 넘겨줄 컨텍스트 변수를 추가하기 위해 get.. 메소드를 오버라이딩
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['tagname'] = self.kwargs['tag']
        return context                                  # 템플릿 파일로 전달

 

Template

blog/post_detail.html

<div>
{{object.content | linebreaks}} <!-- linebreaks : \n -->
</div>

<br>
<div>
    <b>TAGS</b> <i class="fas fa-tag"></i>
    {% load taggit_templatetags2_tags %}                                      <!-- 모듈 로딩 -->
    {% get_tags_for_object object as "tags" %}                                <!-- 커스텀 태그를 사용해 태그 리스트(tags) 추출 -->
    {% for tag in tags %}
    <a href="{% url 'blog:tagged_object_list' tag.name %}">{{tag.name}}</a>
    {% endfor %}
    &emsp;                                                         <!-- 단어 간격 -->
    <a href="{% url 'blog:tag_cloud' %}"> <span class="btn btn-info btn-sm">TagCloud</span></a>
</div>

 

blog/templates/taggit/taggit_cloud.html

<!-- 태그 클라우드를 보여주는 템플릿 파일 -->
{% extends 'base.html' %}

{% block title %}taggit_cloud.html{% endblock %}

{% block extra-style %}
<style type="text/css">
    .tag-cloud {
        width: 40%;
        margin-left: 30px;
        text-align: center;
        padding : 5px;
        border: 1px solid orange;
        background-color: #ffc;
    }
    .tag-1{font-size: 12px;}
    .tag-2{font-size: 14px;}
    .tag-3{font-size: 16px;}
    .tag-4{font-size: 18px;}
    .tag-5{font-size: 20px;}
    .tag-6{font-size: 24px;}
</style>
{% endblock %}

{% block content %}
    <h1>Blog Tag Cloud</h1>
    <br>

    <div class="tag-cloud">
        {% load taggit_templatetags2_tags %}
        {% get_tagcloud as tags %}
        {% for tag in tags %}
        <span class="tag-{{tag.weight|floatformat:0}}">
            <a href="{% url 'blog:tagged_object_list' tag.name %}">{{tag.name}}({{tag.num_times}})</a>
        </span> <!--tag.name 인자를 넘겨 지정 -->
        {% endfor %}
    </div>
{% endblock %}

 

taggit_post_list_html

{% extends "base.html" %}
{% block title %}taggit_post_list.html{% endblock %}
{% block content %}

    <h1>Posts for tag - {{ tagname }}</h1>
    <br>

    {% for post in object_list %}
        <h2><a href='{{ post.get_absolute_url }}'>{{post.title}}</a></h2>
        {{ post.modify_dt|date:"N d, Y" }}
        <p>{{ post.description }}</p>
    {% endfor %}

{% endblock %}

댓글