Web/Django

Django(장고) url 별칭과 네임스페이스 살펴보기

daeunnniii 2021. 8. 3. 00:05
728x90
반응형

이번에는 Django URL 별칭에 대해 정리해볼 것이다.

이전 게시물에서는 템플릿에 다음과 같이 html 코드를 작성했다.

<li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li>

하지만 만약 url 형식을 /pybo/{{ question.id }} 에서 /pybo/question/{{ question.id }} 형식으로 변경해야한다고 하자. 이러한 경우에는 해당 url이 사용된 모든 html 문서를 찾아서 변경해주어야한다. 

따라서 이런 문제점을 해결하기 위해 URL 별칭과 네임인터페이스를 사용한다!

 

1. URL 별칭

URL 별칭을 사용하기 위해선 URL 매핑에 name 속성을 부여해야한다.

/notes/urls.py를 다음과 같이 수정한다.

from django.urls import path
from . import views

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

urls.py를 수정하였으면, 이제 html에는 이 URL 별칭을 사용하도록 바꿔주어야할 것이다.

이전 게시물에서 작성했던 question_list.html을 다음과 같이 URL 별칭으로 변경한다.

{% if question_list %}
<ul>
    {% for question in question_list %}
    <li><a href="{% url 'detail' question.id %}">{{ question.subject }}</a></li>
    {% endfor %}
</ul>
{% else %}
<p>질문이 없습니다.</p>
{% endif %}

 

하드코딩 되어있던 /notes/{{ question.id }}/ 링크를 {% url 'detail' question.id %}로 변경해주었다.

여기서 question.id는 URL 매핑에 정의된 <int:question_id>에 전달해야하는 값을 의미한다.

 

2. URL 네임스페이스

만약 notes 이외에 다른 앱을 추가하게 될 경우 이 앱에서도 index와 detail이라는 URL 별칭을 사용하고 싶을 수도 있다. 이때 중복이 발생하는 문제를 해결하기 위해 urls.py에 app_name 변수를 지정한다.

/notes/urls.py 파일에 app_name을 다음과 같이 추가한다.

from django.urls import path
from . import views

app_name = 'notes'

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

 

그리고 이제 question_list.html 또한 URL 네임인터페이스를 지정해주어야한다.

{% if question_list %}
<ul>
    {% for question in question_list %}
    <li><a href="{% url 'notes:detail' question.id %}">{{ question.subject }}</a></li>
    {% endfor %}
</ul>
{% else %}
<p>질문이 없습니다.</p>
{% endif %}

 

이렇게 간단하게 URL 별칭과 네임스페이스를 사용해보았다!

728x90
반응형