well-balanced

[Django tutorial] 하드코딩된 URL 개선 본문

Python

[Django tutorial] 하드코딩된 URL 개선

Cosmian 2020. 1. 31. 21:34

Django에서는 Template Language를 활용해 urls.py 파일에서 지정해둔 name 값을 통해 url을 가져올 수 있다. 이는 path에 변동이 있을 때 template에도 동적으로 변화를 준다.

기존 하드 코딩된 url path

<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
template 언어를 활용해서 urls의 path를 지정된 name 값으로 가져오는 모습

<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
path('<int:question_id>/', views.detail, name='detail'),
...

# added the word 'specifics' 

path('specifics/<int:question_id>/', views.detail, name='detail'),

...

위와 같이 경로가 바뀔 때 template에도 동적으로 적용된다.

이건 프로젝트라서 app의 개수가 1개지만, 실제 장고 프로젝트에서는 app의 개수가 10개, 20개 혹은 그 이상이 될 지도 모른다. 이럴 때 NameSpace를 써줘야한다. urls.py을 아래와 같이 고쳐보자.

from django.urls import path
from . import views

app_name = 'polls' # App name을 추가

urlpatterns = [
    path('', views.index, name='index'),
    path('<int:question_id>/', views.detail, name="detail"),
    path('<int:question_id>/results', views.results, name="results"),
    path('<int:question_id>/vote', views.vote, name="vote")
]

그리고 template을 아래와 같이 수정해보자.

<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>

{% url 'app_name:url_name' [parameter] %} 의 형태로 작성하면 되고, 'app_name:url_name' 에서 반드시 사이에 공백이 없는 상태로 작성해줘야 한다.

참고한 사이트: https://docs.djangoproject.com/en/3.0/intro/tutorial03/#removing-hardcoded-urls-in-templates

Comments