728x90
pip install django-taggit
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 %}
  <!-- 단어 간격 -->
<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 %}
'Language > 파이썬' 카테고리의 다른 글
장고(django) 앨범, 사진 조회 기능 - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.29 |
---|---|
장고(django) 블로그 글 검색(Search) - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.23 |
장고(django) 프로젝트 첫 페이지, 템플릿 상속 - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.11 |
장고(django)blog app(+아카이브) - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.05 |
장고(django) 셋팅(setting)과 북마크 앱(bookmark app) - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.01 |
댓글