이번에는 웹사이트의 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
가 있어야만 하는 것은 아니다. 예를 들어 그저 한 Article
의 id
가 웹 주소창에 보이게끔 하고 싶다면 다음과 같이 할 수도 있다:
<!-- 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
와 같이 보일 것이다.Django
의 Slug
에 대해서 간략하게 알아보았다. 굳이 slug가 아니더라도 다른 방식으로 이용할 수 있기에 (특히 id 로 주소창에 보이는 경우는 article 처럼 하나의 포스팅이 아니라 고객의 id를 주소창에 보이고 싶을 경우 사용할 수 있다.) 중요한 요소 중 하나이다.
'Django 공부하기' 카테고리의 다른 글
<Django 공부하기> 로그인 이후 특정 페이지로 Redirect하기 (0) | 2020.12.02 |
---|---|
<Django 공부하기> Password Change 구현하기 - (1) (0) | 2020.11.25 |
<Django 공부하기> @property decorator 알아보기 (0) | 2020.11.18 |
<Django 공부하기> 회원탈퇴 구현하기 (2) - 본인인증 후 회원탈퇴 (Deleting User After Authentication) - cleaned_data / widgets / (0) | 2020.11.16 |
<Django 공부하기> templates 폴더를 Root Directory에 정의하기 (templates 폴더를 apps 폴더 안에서 찾게 하지 않기) (0) | 2020.11.13 |