본문 바로가기
카테고리 없음

[Django Framework (6) 태그 구현] 내일배움캠프 AI트랙

by lovvepearl 2022. 1. 25.

Django의 taggit 모듈을 사용해서

게시글의 태그를 설정해줄 수 있다. 

 

01. taggit 설치

 

먼저 taggit을 설치해보자. 

아래 명령어를 차례로 입력하면 설치가 완료된다.

pip install git+https://github.com/jazzband/django-taggit.git@master

Pip install django-taggit-templatetags2

 

02. settings.py에 추가

 

설치된 앱에 추가해주고 설정도 추가해준다. 

INSTALLED_APPS = [
	'taggit.apps.TaggitAppConfig',
	'taggit_templatetags2',
]

TAGGIT_CASE_INSENSITIVE = True
TAGGIT_LIMIT = 50

 

 

03. models.py 설정

 

게시글에 태그를 적용할 것임으로 tweet 앱의 models.py를 수정한다.

 

from taggit.managers import TaggableManager


tags = TaggableManager(blank=True)

'blank=True'는 태그가 비어있어도 작동하도록 설정해주는 것이다.

 

 

04. views.py 설정

 

태그는 게시글과 함께 POST 방식으로 전달된다.

 

tags = request.POST.get('tag','').split(',')


for tag in tags:
    tag = tag.strip()
    if tag != '':
        my_tweet.tags.add(tag)

 

tag의 공백을 없애고 빈칸이 아니라면

tags DB에 저장한다.

 

tags를 html에서 받을때 콤마로 구분하여 받기 때문에

콤마를 기준으로 split하여 쪼개고

strip으로 공백을 없애주는 작업이 필요하다.

 

 

05. html 작성

 

게시글을 작성하는 html에 tag 정보를 받는 input을 생성한다. 

<div class="mt-3 row">
    <label for="tag"
           class="col-sm-2 col-form-label">이 글의 태그</label>
    <div class="col-sm-10">
        <input type="text" class="form-control" name="tag" id="tag"
               placeholder="콤마(,)로 구분 해 주세요">
    </div>
</div>

 

태그를 보여주는 영역도 추가해준다. 

 

{% if tw.tags.all %}
    {% for tag in tw.tags.all %}
        <a style="text-decoration: none"
           href="{% url 'tagged_object_list' tag.name %}">
        <span class="badge rounded-pill bg-success">
            {{ tag.name }}
        </span>
        </a>
    {% endfor %}
    -<a style="text-decoration: none"
        href="{% url 'tag_cloud' %}">TagCloud</a>
{% endif %}

태그가 존재한다면, 반복문을 통해 tags에서 tag가 하나씩

돌면서 출력된다. 

TagCloud는 태그를 클릭하면 태그에 해당하는 게시물을 모아

보여주는 역할을 한다. 

 

 

06. views.py 모듈코드 추가

 

아래코드는 taggit 모듈을 사용하기 위한 기본 코드이다. 

from django.views.generic import ListView, TemplateView

# 중간생략 #

class TagCloudTV(TemplateView):
    template_name = 'taggit/tag_cloud_view.html'


class TaggedObjectLV(ListView):
    template_name = 'taggit/tag_with_post.html'
    model = TweetModel

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

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['tagname'] = self.kwargs['tag']
        return context

 

07. urls.py path 설정

 

마찬가지로 url 기본세팅해준다. 

path('tag/', views.TagCloudTV.as_view(), name='tag_cloud'),
path('tag/<str:tag>/', views.TaggedObjectLV.as_view(), name='tagged_object_list'),

 

08. TagCloud 페이지, Tag글 리스트 html 설정

 

태그 글 리스트

 

{% extends "base.html" %}

{% block title %}태그 글 리스트{% endblock %}

{% block content %}

    <div class="container">
        <h3 class="mt-2">Posts for tag - {{ tagname }}</h3>
        <hr>
        <div class="card">
            <div class="card-body">
                {% for tweet in object_list %}
                    <h4>
                        <a href="/tweet/{{ tweet.id }}">{{ tweet.content }}</a>
                    </h4>
                    {{ tweet.updated_at|timesince}}
                    <p> {{ tweet.author }}</p>
                {% endfor %}
            </div>
        </div>
    </div>
{% endblock %}

 

태그 클라우드 

 

{% extends "base.html" %}

{% block title %}태그 클라우드{% endblock %}


{% block content %}

    <div class="container timeline-container">
        <div class="tag-cloud">
            {% load taggit_templatetags2_tags %}
            {% get_tagcloud as tags %} <!--모든 태그 추출해서 tags변수에 할당-->
            {% for tag in tags %}
                    <a style="text-decoration: none" href="{% url 'tagged_object_list' tag.name %}">
                        <span class="badge rounded-pill bg-primary">
                            {{ tag.name }}({{ tag.num_times }})
                        </span>
                    </a>
            {% endfor %}
        </div>
    </div>

{% endblock %}

 

 

이제 AWS EC2 컴퓨터를 하나 장만하고

Git과 python 을 활용하여

서비스를 배포해보자🌱