본문 바로가기
Research/Django

[Django] 점프 투 장고 튜토리얼 - 02-5. URL과 네임스페이스

by RIEM 2021. 11. 11.
728x90

Django 점프 투 장고 정리

작성일 : 2021-11-11

문서버전 : 1.0

 

개요

이 문서는 점프 투 장고 사이트의 장고 튜토리얼 학습 내용을 정리한 내용입니다.

레퍼런스

점프 투 장고 https://wikidocs.net/72242

 

2-5. URL과 네임스페이스

템플릿에서 사용된 URL의 하드코딩을 없애는 방법을 알아보자.

 

URL 하드코딩

> question_list.html

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

질문 상세 페이지 URL 링크이다. 그러나 URL 링크는 웹 프로그램이 업데이트될 때마다 바꿔줘야 할 필요가 있다. 예를 들어 http://localhost:8000/pybo/question/2 또는 http://localhost:8000/pybo/2/question 처럼 바뀔 수 있기 때문이다.

 

URL 링크의 구조가 자주 변경되면 템플릿에서 사용한 모든 URL들을 하나하나 수정해야하는 번거로움이 생긴다. 이를 위해 실제 URL 링크 대신 링크의 주소가 매핑된 별칭을 사용해야 한다. 

 

URL 별칭

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

 별칭 ‘index’ - http://localhost:8000/pybo/

별칭 ‘detail’ - http://localhost:8000/pybo/2

 

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

위에서 pybo/urls.py의 파일에 별칭을 추가해주었으니, 템플릿에서 해당 URL 별칭을 사용할 수 있게 되었다.

> ../projects/mysite/templates/pybo/question_list.html

 

기존

 
{% if question_list %}
  <ul>
  {% for question in question_list %}
      <li><a href="/pybo/{{question.id}}/"/>{{question.subject}}</a></li>
  {% endfor %}
  </ul>

{% else %}
  <p>What can we ask?</p>
{% endif %}

 

수정(별칭 추가)

{% if question_list %}
  <ul>
  {% for question in question_list %}
      <li><a href="{% url 'detail' question.id %}"/>{{question.subject}}</a></li>
  {% endfor %}
  </ul>

{% else %}
  <p>What can we ask?</p>
{% endif %}

 

하드코딩된 링크가 수정되었다. 여기서 question.id는 <int:question_id>에 전달해야 하는 값을 의미한다.

 

URL 네임스페이스

Pybo 앱 하나만 사용중이지만 pybo 앱 이외 다른 앱이 프로젝트에 추가될 수 있다. 다른 앱에서 동일한 URL별칭을 사용하면 중복이 발생한다. 이를 해결하기 위해 pybo/urls.py 파일에 네임스페이스 의미하는 app_name 변수를 지정한다.

 

네임스페이스 의미하는 app_name 변수는 다른 앱들간 동일한 URL 별칭 사용으로 인해 발생하는 중복을 방지하기 위함!

> ../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_name을 pybo로 설정했다. 이렇게 수정하고 http://localhost:8000/pybo/ 페이지 요청하면 아래와 같이 오류가 발생한다.


> ../projects/mysite/templates/pybo/question_list.html

위 오류를 해결하기 위해 템플릿에서 사용한 URL별칭에 네임스페이스를 아래와 같이 지정한다.

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

{% url ‘detail’ question.id %}{% url ‘pybo:detail’ question.id %}으로 바꾸어 주었다. Detail 앞에 pybo라는 네임스페이스를 붙여준 것이다.

 

URL별칭은 템플릿 외 redirect함수에서도 사용된다. 아래 redirect 함수의 사용은 추후에 공부한다. ex) redirect(‘pybo:detail’, question_id=question.id)

 

728x90

댓글