리셋 되지 말자

[점프 투 장고] URL과 네임스페이스 본문

Django

[점프 투 장고] URL과 네임스페이스

kyeongjun-dev 2020. 12. 1. 19:32

URL 하드코딩

question_list.html 템플릿에 사용된 링크는 다음과 같다.

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

상세조회를 위한 URL 링크다. 하지만 이러한 URL 규칙은 웹 프로그램이 발전할 때마다 수정될 가능성이 크다. 예를들어 현재는 /pybo/2/ 이지만, 나중에는 /pybo/2/question 등으로 확장될 수도 있다.

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

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'),
]

localhost:8080/pybo/는 index, localhost:8080/pybo/2/는 detail 이라는 이름을 부여했다.

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

별칭을 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 %}

하드코드 되어 있던 /pybo/{{question.id}} 링크가 {% url 'detail' question.id %} 로 변경되었다. 여기서 question.id는 URL 매핑에 정의된 <int:question_id>를 의미한다.

URL 네임스페이스

현재는 pybo 앱 하나만 작성중이지만 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'),
]

이를 question_list.html 템플릿에서도 적용해야 한다.

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

detail 앞에 pybo 라는 네임스페이스가 추가되었다.

'Django' 카테고리의 다른 글

django 파일 이름, 타입, 크기 얻기  (0) 2021.03.07
[점프 투 장고] 데이터 저장  (0) 2020.12.01
[점프 투 장고] 조회와 템플릿  (0) 2020.12.01
[점프 투 장고] 장고 관리자  (0) 2020.12.01
[점프 투 장고] model  (0) 2020.12.01
Comments