장고 - Tag 기능 학습
ex) wps_blog
1. django-tagging 모듈 설치
2. 모델에 TagField 설정
- 경로 : 앱 > models.py
1
2
3
4from 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
4INSTALLED_APPS = [
...,
'tagging',
]
4. 뷰 코드 작성
- 경로 : post(앱 이름) > views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14class 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
11from 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 %}
Posted