[Django] URL 패턴에 이름 부여하기

sudog·2023년 9월 5일
0

Django

목록 보기
5/13

이런 상황을 생각해보자. 아래 코드는 포스팅을 위한 장고 URL 패턴을 만들고 HTML 문서에 개별 포스트 링크를 만들어 제목을 클릭하면 해당 포스트의 페이지로 이동하는 것을 구현했다.

# config/urls.py

from django.urls import path, include

urlpatterns = [
    path("post/", include("post.urls")),
]
# post/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path("detail/<int:id>", views.detail_view),
]
<!-- home.html -->

<ul>
  <li><a href="/post/detail/1">Detail Page 1</a></li>
  <li><a href="/post/detail/2">Detail Page 2</a></li>
  <li><a href="/post/detail/3">Detail Page 3</a></li>
  <li><a href="/post/detail/4">Detail Page 4</a></li>
  <li><a href="/post/detail/5">Detail Page 5</a></li>
  <li><a href="/post/detail/6">Detail Page 6</a></li>
  <li><a href="/post/detail/7">Detail Page 7</a></li>
  <li><a href="/post/detail/8">Detail Page 8</a></li>
  <li><a href="/post/detail/9">Detail Page 9</a></li>
  <li><a href="/post/detail/10">Detail Page 10</a></li>
</ul>

이 상황에서 만약 URL 패턴을 변경해야 한다고 생각해 보자.
post/detail/1post/1이나 post/page/detail/1로 변경될 수가 있다. 그럼 우리는 그때마다 작성해 놓은 모든 링크를 하드코딩으로 변경해야 한다.

이것은 함수의 코드와 데이터가 분리되지 않아 데이터가 변할 때마다 코드를 수정해야 하는 상황과 유사하다. 우리는 이것을 해결하기 위해 매개변수에 입력받은 데이터를 저장해서 데이터 종속성을 제거한다.

장고가 제공하는 URL 별칭도 이와 비슷한 해결방법을 사용한다. 다음과 같이 코드를 변경해 보자.

# config/urls.py

from django.urls import path, include

urlpatterns = [
    path("post/", include("post.urls", namespace="post")),
]
# post/urls.py

from django.urls import path
from . import views

app_name = "post"

urlpatterns = [
    path("detail/<int:id>", views.detail_view, name="detail"),
]
<!-- home.html -->
<ul>
  {% for post in posts %}
  <li>
    <a href="{% url 'post:detail' post.id %}">
      Detail Page {{ post.id }}
    </a>
  </li>
</ul>

조금 극적인 효과를 주기 위해 템플릿 문법을 사용했다. 위 코드를 해석해 보자. 가장 먼저, config/urls.pynamespace라는 속성이 보일 것이다. 이것은 앱의 스코프를 지정해주기 위한 속성으로, 여러 앱에서 같은 별칭을 사용할 때의 모호성을 제거하기 위해 존재한다.

네임스페이스를 사용하기 위해 반드시 post/urls.py의 상단에 app_name = "post"로 앱 이름을 지정해 주어야 한다. 네임스페이스 post가 가리키는 앱을 장고에게 알려주는 것이라고 생각하자.

이제 HTML 안에서 <namespace>:<name>을 사용하면 URL 패턴을 매개변수의 값으로 전달받아 사용이 가능하다. 이제 URL 패턴을 변경하더라도, 별칭의 이름만 같다면 HTML 코드를 수정할 일이 없을 것이다.

profile
안녕하세요

0개의 댓글