Slug란?
Django에서 Slug는 URL 친화적인 문자열을 나타내며, 보통 데이터베이스 모델의 필드로 사용된다. 슬러그는 일반적으로 페이지나 포스트 제목 같은 사람이 읽을 수 있는 텍스트를 포함하여, 이를 URL에 사용할 수 있도록 영문자, 숫자, 밑줄, 하이픈 만 포함하는 형태이다.
검색엔진이 사이트의 페이지를 크롤링 . 할때, 제목, 헤더, 본문 텍스트, 이미지 대체 텍스트, 메타 디스크립션, URL등 모든 부분에서 검색을 하는데, 검색 엔진은 URL의 키워드를 인식하고 이를 기준으로 페이지 내용을 평가하는 부분 덕분에 슬러그는 검색 엔진 최적화에 도움을 줄 수 있다.
Slug의 특징과 장점
- 고유성: 슬러그는 고유해야한다. 이점에서 데이터베이스의 기본 키 처럼 동작할 수 있다.
- 짦고 의미 있음: 슬러그는 잛고 의미가 있으며, URL에서 쉽게 읽히고 기억될 수 있어야한다.
- 유지 관리: 슬러그는 데이터 변경 후에도 일정하게 유지되기 댸문에 URL이 변경되지 않는다.
Django slug 사용 방법
Django에서는 models.SlugField를 사용하여 슬러그 필드를 정의한다. 기본적으로 이 필드는 문자열을 받아 URL에서 사용할 수 있는 형식으로 저장한다.
Models.py
# hottrack/models.py
from __future__ import annotations
from datetime import date
from typing import Dict
from urllib.parse import quote
from django.urls import reverse
from django.utils.html import format_html
from django.utils.text import slugify
from django.db import models
class Song(models.Model):
melon_uid = models.CharField(max_length=20, unique=True)
slug = models.SlugField(allow_unicode=True, blank=True)
rank = models.PositiveSmallIntegerField()
album_name = models.CharField(max_length=100)
name = models.CharField(max_length=100)
artist_name = models.CharField(max_length=100)
cover_url = models.URLField()
lyrics = models.TextField()
genre = models.CharField(max_length=100)
release_date = models.DateField()
like_count = models.PositiveIntegerField()
class Meta:
indexes = [
models.Index(fields=["slug"]),
]
def save(self, *args, **kwargs):
self.slugify()
super().save(*args, **kwargs)
def slugify(self, force=False):
if force or not self.slug:
self.slug = slugify(self.name, allow_unicode=True)
def get_absolute_url(self) -> str:
return reverse(
"song_date_detail",
args=[
self.release_date.year,
self.release_date.month,
self.release_date.day,
self.slug,
],
)
Song 모델에서 SlugField에 대한 전체 코드이고 관련 내용은 다음과 같다.
slug = models.SlugField(allow_unicode=True, blank=True)
allow_unicode=True를 통해서 슬러그 필드가 유니코드 문자를 허용하도록 설정한다. 즉, 영어 외에도 한글, 일본어 등 다양한 문자를 포함할 수 있도록 한것이다.
class Meta:
indexes = [
models.Index(fields=["slug"]),
]
Meta 클래스 내에 정의된 인덱스는 데이터베이스에서 슬러그 필드에 대한 인덱스를 생성하여 검색 기능을 향상 시키도록 하였다.
def save(self, *args, **kwargs):
self.slugify()
super().save(*args, **kwargs)
def slugify(self, force=False):
if force or not self.slug:
self.slug = slugify(self.name, allow_unicode=True)
save 메서드를 오버라이드하여 데이터베이스에 저장되기전에 slugify를 호출하도록 하였고, slugify 메서드에서는 슬러그 필드가 비어있고나 force=True가 지정된 경우에 name 필드를 기반으로 슬러그를 생성한다.
def get_absolute_url(self) -> str:
return reverse(
"song_date_detail",
args=[
self.release_date.year,
self.release_date.month,
self.release_date.day,
self.slug,
],
)
get_absolute_url을 통해서 특정 노래의 상세 페이지 URL을 반환한다. 노래의 발매 연도, 월, 일, 슬러그를 등록해두었다.
Slug를 이용한 URL 등록
re_path(
route=r"^(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$",view=views.SongDateDetailView.as_view(),
name="song_date_detail",
),
Views에서의 등록
class SongDateDetailView(DateDetailView):
model = Song
date_field = "release_date"
month_format = "%m"
'BackEnd > Django, DRF' 카테고리의 다른 글
[Django] django_extensions (0) | 2024.06.17 |
---|---|
[Django] URL Reverse를 통한 URL 작성 (0) | 2024.06.17 |
[Django] django-debug-toolbar (0) | 2024.06.11 |
[Custom] path와 re_path, CustomConverter를 통한 url 정의하기 (0) | 2024.06.10 |
[Django] 동적 이미지 생성, CSV & 엑셀 응답을 처리하는 View 만들기 (0) | 2024.06.10 |