출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기

<Django 공부하기> 웹사이트 slug 추가하기

category Django 공부하기 2020. 11. 30. 02:01

이번에는 웹사이트의 slug를 Django에서 적용시키는 방법에 대해서 알아보도록 하겠다.


Slug란 무엇인가?

Slug란, 흔히들 우리의 웹사이트 주소창에 보면 나오는 것이다. 다음의 사진을 한번 보자:

여기에 보면 .../manage/newpost/... 라고 명시되어 있는 것을 볼 수 있다. 이렇게 웹사이트 주소 뒤에 따라 오는 부분을 slug라고 이해하면 편하다.


models.py 수정하기

이 특정한 포스팅의 목적을 위해 다음과 같은 모델 클래스를 만든다:

# models.py
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField()
    body = models.TextField()

    def __str__(self):
        return self.title


Django의 모델 클래스에는 SlugField라는 부분이 포함되어 있어, 원하는 slug를 만들 수 있게끔 해준다.


urls.py 수정하기

다음과 같이 urls.py를 수정해준다:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('<slug:slug>/', views.article_details, name='article_details'),
]


slug:slug에 대해서는 여기서 더 자세하게 알아볼 수 있다.


views.py 수정하기

다음과 같이 views.py를 수정해준다:

# views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import *

def article_details(request, slug):
    return HttpResponse(slug)



html template 수정하기

또한, html template의 해당되는 부분을 다음과 같이 추가/수정해준다.:

<!-- article_list.html -->
<h2><a href="{% url 'article_details' article.slug %}">{{ article.title }}</a></h2>


여기서 article_list.html의 경우는 article_detail을 불러올 링크가 있는 사이트이다. 현재는 HttpResponse로 불러오기 때문에 따로 article_details html template을 만들지는 않았다.
이렇게 하게 된다면 slug에 해당되는 article을 불러올 수 있다. (물론 HttpResponse로 불러왔기 때문에 매우 간략한 방법이다.)
또한, 이렇게 하게 된다면 결과물로는 127.0.01:8000/articles/slug로, 여기서의 slug는 모델 클래스에서 정의해준 slug 형식으로 나올 것이다.

이 방식을 사용할 경우, 안 좋은 점은 우리가 일일이 만든 article마다 slug를 추가해줘야 한다는 뜻인데, 이를 자동으로 생성시키는 방법에 대해서는 다음에 다루어볼 수 있도록 하겠다.

 

다른 방식의 slug

참고로 slug는 무조건 SlugField가 있어야만 하는 것은 아니다. 예를 들어 그저 한 Articleid가 웹 주소창에 보이게끔 하고 싶다면 다음과 같이 할 수도 있다:

<!-- article_list.html -->
<h2><a href="{% url 'article_details' article.id %}">{{ article.title }}</a></h2>
# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('article/<str:pk_id>', views.article_details, name='article_details'),
]
# views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import *

def article_details(request, pk_id):
    article = Article.objects.get(id=pk_id)
    return HttpResponse(article)


urls.py에서 article/<str:pk_id> 에서 article/이 먼저 붙는 이유는, id로 불러올 경우 해당 id는 Article 클래스의 몇번째 id가 되기 때문이다. 이렇게 할 경우 127.0.01:8000/articles/article/2 와 비슷한 모습으로 보일 것이다. 또한, admin 페이지에 들어가서 만들어서 생성되어 있는 Article 클래스에서 해당 article을 클릭해본다면, 앞서 소개한 주소창과 비슷하게 ...admin/articles/article/2 와 같이 보일 것이다.



DjangoSlug에 대해서 간략하게 알아보았다. 굳이 slug가 아니더라도 다른 방식으로 이용할 수 있기에 (특히 id 로 주소창에 보이는 경우는 article 처럼 하나의 포스팅이 아니라 고객의 id를 주소창에 보이고 싶을 경우 사용할 수 있다.) 중요한 요소 중 하나이다.