장고 시작하기 13. 장고 URL NameSpace

URL에 name 붙여줘서 편하게 URL name으로 페이지를 이동하고 렌더링 했는데요. 이 name이 app 사이에 중복되면 어떻게 될까요? 이런 사태를 방지하고자 장고에는 URL NameSpace 기능이 있습니다. 장고 URL NameSpace 개념을 이해해야 URL 라우팅을 제대로 할 수 있는 것 같네요.

이번 포스트에서는 NameSpace에 대해서 공부한 내용을 정리해 보았습니다.

장고 URL NameSpace

서로 다른 app의 urls.py에서 동일한 URL name을 쓰는 경우가 존재할 수 있습니다. 아래 2개의 코드는 각각 article이라는 app에 hello라는 동일한 name의 path가 존재하는 경우 입니다.

articles/urls.py

from django.urls import path
from . import views

urlpatterns = [
    ...
    path("hello/", views.hello, name="hello"),
    ...
]

users/urls.py

from django.urls import path
from . import views

urlpatterns = [
    ...
    path("hello/", views.hello, name="hello"),
    ...
]

위와 같은 경우 hello라는 URL name을 찾아가야 하는데 name의 중복으로 인해 사용자가 원하는 URL로 이동하지 않을 수 있습니다.

{% url 'hello' %} # user app의 hello? article app의 hello?

redirect('hello') # user app의 hello? article app의 hello?

url name이 중복되는 경우 settings.py의 INSTALLED_APPS에 인덱스가 상위에 있는 app의 URL로 이동하게 됩니다만 사용자와 의도한 url이 아닐 수 있습니다.

때문에 Django는 서로 다른 앱에서 동일한 URL Name을 사용하는 경우, 고유하게 구분할 수 있도록 namespace를 지원합니다.


방법은 간단합니다. urls.py에 namespace를 입력하면 끝인데요.

app_name이라는 변수가 namespace 입니다.

articles/urls.py

from django.urls import path
from . import views

app_name = "articles"

urlpatterns = [
        ...
    path("hello/", views.hello, name="hello"),
    ...
]

이제 view나 template에서 URL을 입력할 때, namespace:url_name형태로 사용하면 됩니다.

{% url 'articles:hello' %}

redirect('articles:hello')

참고하면 좋은 글

Leave a Comment

목차