Study/Django

[Django] URL 별칭 (9)

taecongs 2023. 9. 12. 15:44

Django 공부하기 ✨
참고 사이트 : 파이보 (점프 투 장고)


URL 별칭이 필요한 이유는?

  • 실제 프로젝트에서 URL 리팩토링은 빈번하게 발생한다.
  • URL 링크의 구조가 자주 변경된다면 템플릿에서 사용한 모든 URL들을 일일이 찾아가며 수정해야 하는 리스크가 발생한다.
  • 이러한 문제점을 해결하기 위해 해당 URL에 대한 실제 링크 대신 링크의 주소가 1:1 매핑되어 있는 별칭을 사용 할 수 있다.

 

(1) 링크 주소 대신 URL 별칭 사용하기

  • URL 매핑에 name 속성을 부여하면 된다.
// (1) projects\mysite\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'),   // 추가된 항목
]
  • http://localhost:8000/pybo/ URL은 index, http://localhost:8000/pybo/2와 같은 URL에는 detail 이라는 별칭을 부여한 것이다.

 

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

  • 하드 코딩 되어 있던 기존 /pybo/{{ question.id }} 링크를 {% url 'detail' question.id %}로 변경했다.
// (2) projects\mysite\templates\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 %}
  • 위의 코드에서  question.id는 URL 매핑에 정의된 <int:question_id>에 전달해야 하는 값을 의미한다.

 

(3) URL 네임스페이스

  • 현재는 하나의 앱만 사용중이지만 추후에 다른 앱이 프로젝트에 추가될 수도 있다.
  • 이런 경우 다른 앱에서 동일한 URL 별칭을 사용하면 중복이 발생된다.
  • 위와 같은 상황까지 고려해야하기 때문에 네임스페이스를 추가 하는 것이 좋다.
// (3-1) projects\mysite\pybo\urls.py 파일 수정하기
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_namepybo로 설정하고 http://localhost:8000/pybo/ 페이지를 요청하면 아래와 같은 오류가 발생한다.

  • 네임스페이스를 추가한 경우 발생하는 오류이다.
  • 템플릿에 사용한 URL 별칭에도 네임스페이스를 지정해줘야 한다.
// (3-2) projects\mysite\templates\pybo\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 라는 네임스페이스를 붙여줬다.

'Study > Django' 카테고리의 다른 글

[Django] settings.py  (0) 2023.09.13
[Django] 데이터 저장 (10)  (0) 2023.09.12
[Django] 템플릿 언어  (0) 2023.09.11
[Django] 조회와 템플릿 (8)  (0) 2023.09.11
[Django] 관리자 사용하기 (7)  (0) 2023.09.08