웹 애플리케이션의 사용자 경험을 최적화하는 것은 웹 개발자에게 매우 중요하며, 특히 장고에서 슬러그를 통합한 사용자 친화적인 URL 구조를 활용하여 사용성, 접근성 및 검색 엔진 가시성을 향상시키는 데 있어서는 더욱 그렇습니다. 이러한 URL은 간단한 함수 생성을 통해 손쉽게 구현할 수 있으며, 짧고 유익하며 쉽게 이해할 수 있는 URL을 생성하여 사용자와 검색 엔진 모두에게 도움이 됩니다.

이 문서에 사용된 코드 샘플은 앞서 언급한 GitHub 리포지토리를 통해 액세스할 수 있습니다.

장고 프로젝트 만들기

장고 프레임워크는 웹사이트 컨텍스트 내에서 슬러그를 만들고 활용하기 위한 다양한 기술을 제공합니다. 예를 들어 이 튜토리얼에서는 기본 블로그 애플리케이션에서 슬러그를 구현하는 방법을 보여드립니다.

장고 프로젝트에서 작업을 시작할 때 필요한 종속성을 설치하기 위해 가상 환경을 만들고 활성화하는 것이 좋습니다. 가상 환경을 활성화한 후에는 다음 지침을 준수하여 프로젝트를 설정해야 합니다.

터미널 내에서 pip 명령을 사용하여 Django를 설치하세요.

pip install django

이 튜토리얼에서는 django-admin 유틸리티를 사용하여 “project\_core”라는 이름의 프로젝트를 생성합니다.

django-admin startproject project_core .

애플리케이션이 개발되어 “Recipes”로 지정되었습니다.

python manage.py startapp recipes

프로젝트와 연결된 settings.py 파일의 설치된 애플리케이션 목록에 애플리케이션을 포함합니다.

INSTALLED_APPS = [
    '...'
    'recipes',
]

애플리케이션을 실행하려면 명령줄 인터페이스에 다음 명령을 입력하세요:

python manage.py runserver

웹 브라우저에서 에 위치한 웹사이트를 방문하면 웹페이지가 표시됩니다.

프로젝트의 ‘urls.py’ 파일에 지정된 대로 웹 애플리케이션에 대해 원하는 유니폼 리소스 로케이터(URL) 구조를 구성하는 프로세스입니다.

from django.urls import path, include

urlpatterns = [
    '...',
    path('', include('recipes.urls'))
]

장고에서 슬러그 만들기

장고 모델에 대한 URL 친화적인 슬러그를 만들려면 models.py 파일의 모델 정의에 슬러그 필드를 추가해야 합니다. 다음 프로세스를 활용하여 Django에서 최적의 슬러그를 생성할 수 있습니다:

모델 생성

models.py 파일에서 참조하기 쉽도록 새로운 엔티티를 공식화하고 “슬러그”라는 고유 식별자를 통합하는 것이 좋습니다. 샘플 구현은 다음과 유사합니다:

class Recipe(models.Model):
    name = models.CharField(max_length=225, blank=False, null=False)
    ingredients = models.TextField(blank=False, null=False)
    instructions = models.TextField(blank=False, null=False)
    date_created = models.DateTimeField(auto_now=True)
    slug = models.SlugField(null = True, blank=True, unique=True)

앞의 그림은 “슬러그”라는 속성을 포함하는 “레시피”라는 모델을 보여줍니다.이 “슬러그” 속성은 기본적으로 각각 true 값과 함께 null 및 공백이라는 특성이 할당되어 있습니다.

모델에 마이그레이션 적용

모델을 제작할 때 데이터베이스의 범위 내에서 테이블을 생성하기 위해 명령줄 인터페이스를 활용하는 것이 필수적입니다.

python manage.py makemigrations && python manage.py migrate

앞서 언급한 명령은 마이그레이션 파일을 생성하며, 이후 마이그레이션 파일에 포함된 지침을 구현하여 데이터베이스를 업데이트하는 데 활용됩니다.

이 글도 확인해 보세요:  JavaScript를 사용하여 이미지에 X 및 Y 좌표를 오버레이하는 방법

데이터베이스에 데이터 추가

admin.py 파일에 다음을 입력하여 모델을 등록합니다:

from django.contrib import admin
from .models import Recipe

admin.site.register(Recipe)

터미널을 사용하여 다음 명령을 입력하여 관리 패널에 대한 상승된 권한이 있는 계정을 만듭니다:

python manage.py createsuperuser

슈퍼유저 계정을 생성한 후 다음 지시어를 사용하여 로컬 서버를 시작하세요:

python manage.py runserver

서버가 시작되면 ” ” URL로 이동하여 슈퍼유저 생성 시 부여된 로그인 자격 증명을 사용하고 슬러그 필드를 꼼꼼히 관찰하면서 데이터베이스에 몇 가지 레시피를 부지런히 도입하세요.

앱에 대한 보기 만들기

views.py 파일에서 애플리케이션에 대한 보기를 2개 이상 만들어야 하며, 하나는 사용 가능한 모든 레시피에 대한 간단한 요약이고 다른 하나는 각 개별 레시피에 대한 자세한 정보를 제공해야 합니다. 이러한 뷰는 프로젝트 내에서 다음과 같이 활용할 수 있습니다:

from django.shortcuts import render, get_object_or_404
from .models import Recipe

# List view for recipes
def recipe_list(request):
    recipes = Recipe.objects.all()
    return render(request, 'recipes/recipe_list.html', {"recipes":recipes})

# Detail view for each recipe
def recipe_detail(request, recipe_slug):
    recipe = get_object_or_404(Recipe, slug=recipe_slug)
    return render(request, 'recipes/recipe_detail.html', {'recipe': recipe})

앞서 언급한 코드 블록은 Django 애플리케이션에 대한 두 가지 보기를 보여줍니다. 첫 번째 보기는 “recipe\_list”로 지정되어 HTML 템플릿 내에서 레시피의 전체 카탈로그를 렌더링하는 역할을 합니다. 반대로 “recipe\_detail”로 지정된 두 번째 보기는 “recipe\_slug”라는 고유 식별자를 기반으로 단독 레시피를 제공합니다. 후자의 보기는 데이터베이스에서 해당 슬러그를 추출하고 관련 세부 정보를 표시하기 위해 “recipe\_slug”라는 추가 입력이 필요합니다.

보기에 대한 URL 패턴 구성

주어진 텍스트의 문구를 바꾸는 데 도움이 필요하십니까?

from django.urls import path
from .views import recipe_list, recipe_detail

urlpatterns = [
    path('', recipe_list, name='recipe-home'),
    path('recipe/<slug:recipe_slug>/', recipe_detail, name='recipe_detail'),
]

앞서 언급한 코드 조각은 두 번째 경로를 활용하여 웹 페이지의 URL에 슬러그를 식별자로 통합합니다.

앱용 템플릿 만들기

`%{url ‘view\_name’ recipe.slug %}`.코드에서 다음 스니펫 중 하나를 사용할 수 있습니다:

<!-- recipes/recipe_list.html -->
{% extends 'base.html' %}

{% block content %}
    <h1 class="my-5 text-center">Recipes</h1>
    <center>
        <ul class="list-group w-75">
            {% for recipe in recipes %}
              <li class="list-group-item my-3">
                <h2 class="mb-3">
                  <a href="{% url 'recipe_detail' recipe.slug %}">
                    {{ recipe.name }}
                  </a>
                </h2>
                <p class="w-50">
                  Ingredients: {{ recipe.ingredients }}
                </p>
                <p class="text-muted">
                  Created: {{ recipe.date_created }}
                </p>
              </li>
            {% empty %}
              <li class="list-group-item">No recipes found.</li>
            {% endfor %}
          </ul>
    </center>
{% endblock %}

앞서 언급한 HTML 템플릿은 데이터베이스에 있는 모든 레시피를 표시하고 사용 가능한 레시피가 없는 경우 “레시피 없음”을 표시하도록 설계되었습니다. 이 템플릿은 꾸미기를 위해 부트스트랩 클래스를 사용합니다. 부트스트랩과 장고를 통합하는 방법에 대한 지식을 습득할 수 있습니다. 브라우저에서 앞서 언급한 템플릿의 모양은 다음과 유사합니다:

이 글도 확인해 보세요:  녹 매크로: 매크로를 사용하여 코드를 개선하는 방법

<!-- recipes/recipe_detail.html -->
{% extends 'base.html' %}

{% block content %}
  <center>
    <div class="w-75">
      <h1 class="mt-5 mb-4">{{ recipe.name }}</h1>
      <h3>Ingredients</h3>
      <p>{{ recipe.ingredients }}</p>
      <h3>Instructions</h3>
      <p>{{ recipe.instructions }}</p>
      <p class="text-muted">Created: {{ recipe.date_created }}</p>
    </div>
  </center>
{% endblock %}

앞서 언급한 HTML 템플릿은 특정 레시피에 관한 정보를 검색하여 웹 브라우저에 체계적으로 표시하므로 다음과 유사한 시각적 디스플레이가 생성됩니다:

웹 주소는 데이터베이스 내의 각 레시피에 할당된 고유 식별자를 통합하도록 최적화되었습니다. 이 기능은 템플릿 시스템을 활용하여 구현되었으며, 장고의 템플릿 상속과 모델-뷰-템플릿(MVT) 아키텍처 설계를 연구하면 더 잘 이해할 수 있습니다.

장고에서 슬러그 자동 생성

모델 내의 특정 필드를 기반으로 슬러그 생성을 자동화하려면 데이터베이스에 데이터를 저장하기 전에 사용자 지정 규정을 통합하여 모델의 save() 메서드의 기능을 변경해야 합니다. 이 작업을 수행하는 간단한 접근 방식은 아래에 제시되어 있으며, 모델 클래스에 통합할 수 있습니다:

# import slugify
from django.template.defaultfilters import slugify

def save(self, *args, **kwargs):
    if not self.slug:
        self.slug = slugify(self.name)
    super().save(*args, **kwargs)

이 함수는 존재하는 슬러그가 모델 항목과 연관되어 있는지 확인하는 것으로 시작됩니다. 슬러그가 없는 경우 슬러그파이 유틸리티를 사용하여 모델의 이름 속성에서 고유 식별자를 생성합니다. 이 기능은 저장() 메서드를 재정의하여 사용자 정의되었으므로 사용자가 슬러그 필드를 수동으로 입력할 필요 없이 관리자 패널을 통해 새 레시피를 추가할 때 슬러그를 편리하게 채울 수 있습니다.

최근에 추가된 레시피의 상세 페이지에 방문하면 URL이 레시피 제목을 슬러그로 사용하는 것을 확인할 수 있습니다.

경우에 따라 레시피 이름이 중복되는 경우 동일한 명칭으로 두 개 이상의 항목이 존재하기 때문에 잘못된 슬러그가 발생할 수 있습니다. 이러한 불일치를 방지하려면 만든 날짜와 같이 각 레시피를 다른 레시피와 구분할 수 있는 식별자를 통합하는 것이 좋습니다.

self.slug = slugify(self.name + "-" + str(self.date_created))

슬러그를 사용하여 URL 경험 향상

슬러그는 기본 키와 같은 특정 식별자URL에 국한되지 않기 때문에 다용도성 및 이동성 등 다양한 이점을 제공합니다.따라서 데이터베이스 아키텍처를 개편하거나 데이터를 재배치할 때 균일한 리소스 로케이터(URL)가 변경되지 않고 유지되므로 최적의 검색 엔진 최적화(SEO)를 촉진할 수 있습니다.

By 박준영

업계에서 7년간 경력을 쌓은 숙련된 iOS 개발자인 박준영님은 원활하고 매끄러운 사용자 경험을 만드는 데 전념하고 있습니다. 애플(Apple) 생태계에 능숙한 준영님은 획기적인 솔루션을 통해 지속적으로 기술 혁신의 한계를 뛰어넘고 있습니다. 소프트웨어 엔지니어링에 대한 탄탄한 지식과 세심한 접근 방식은 독자에게 실용적이면서도 세련된 콘텐츠를 제공하는 데 기여합니다.