본문 바로가기
Django

(6) URL 별칭

by kingyejin 2024. 7. 2.

URL 하드코딩

URL 링크의 구조가 자주 변경된다면 템플릿에서 사용한 모든 URL들을 일일이 찾아가며 수정해야 하는 리스크가 발생한다. 이에 해당 URL에 대한 실제 링크 대신 링크의 주소가 1:1 매핑되어 있는 별칭을 사용해야 한다.


URL 별칭

링크의 주소 대신 별칭을 사용하려면 URL 매핑에 name 속성을 부여하면 된다. 

pybo/urls.py 파일을 다음과 같이 수정하자.

from django.urls import path

from . import views

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


템플릿에서 URL 별칭 사용하기

이렇게 pybo/urls.py 파일에 별칭을 추가하면 pybo\question_list.html 템플릿에서 다음처럼 사용할 수 있다.

{% 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 %}


URL 네임스페이스

pybo 앱 이외의 다른 앱이 프로젝트에 추가 될 수도 있을 텐데,

이런 경우 서로 다른 앱에서 동일한 URL 별칭을 사용하면 중복이 발생할 것이다.

 

이 문제를 해결하려면 pybo/urls.py 파일에 네임스페이스를 의미하는 app_name 변수를 지정해야한다.

from django.urls import path

from . import views

app_name = 'pybo'

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

 

app_name을 pybo로 설정하였다.

그런데 이렇게 수정하고 http://localhost:8000/pybo/ 페이지를 요청하면  다음과 같은 오류가 발생한다.

 

이 오류는 네임스페이스를 추가했기 때문에 발생한 오류이다.

이 오류를 해결하려면 detail 앞에 pybo 라는 네임스페이스를 붙여줘서

템플릿에서 사용한 URL 별칭에 네임스페이스를 다음과 같이 지정해야 한다.

{% url 'pybo:detail' question.id %}

'Django' 카테고리의 다른 글

(8) 부트스트랩  (0) 2024.07.02
(7) 데이터 저장 및 스태틱  (0) 2024.07.02
(5) Pybo 질문 목록과 상세 기능 구현하기  (0) 2024.07.02
(4) 장고 관리자  (1) 2024.07.02
(3) 장고에서 모델 사용하기  (0) 2024.07.01