새소식

python/Django

Django - mysite (URL과 네임스페이스)

  • -

링크

이 페이지의 내용 정리 위캔입니다.

URL 하드코딩

  • <li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li>
    • 질문 상세를 위한 URL 링크이다.
    • 이러한 URL 링크는 웹 프로그램이 발전할 때마다 수정될 가능성이 크다.
    • 예)
      1. http://localhost:8000/pybo/2/question
      2. http://localhost:8000/pybo/question/2
    • URL 링크의 구조가 자주 변경된다면 템플릿에서 사용한 모든 URL을 일일이 찾아가며 수정해야하는 리스크 발생
    • 이를 해결하기 위해 URL에 대한 실제 링크 대신 링크의 주소가 매핑 되어있는 별칭 사용

      URL 별칭

  • URL 매핑에 name 속성을 부여해야한다.
  • 경로 : ...pybo/urls.py
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이라는 이름을 부여했다.

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

  • 경로 : ...templates\pybo\question_list.html
...
{% for question in question_list %}
    #수정
    <li><a href="{% url 'detail' question.id %}">{{ question.subject }}</a></li>
    ...
  • 하드코딩 되어있던 /pybo/{{ question.id }}링크가 %url 'detail' question.id %로 변경되었다.
    • question.id는 URL 매핑에 정의된 <int:question_id>에 전달해야 하는 값을 의미한다.

URL 네임스페이스

  • 이후 다른 앱에서도 동일한 URL 별칭을 사용할 수 있으므로 ...pybo/urls.py 파일에 네임스페이스를 의미하는 app_name 변수를 지정한다.
  • 경로 : mysite\pybo\urls.py
from . views

app_name = 'pybo'
...
  • 위와 같이 수정하고 페이지를 요청하면 오류가 발생한다.
  • 오류를 해결하려면 템플릿에서 사용한 URL 별칭에 네임스페이스를 지정해야 한다.
  • 경로 : ...templates\pybo\question_list.html
# 수정
<li><a href="{% url 'pybo:detail' question.id %}">{{ question.subject }}</a></li>

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

  • detail 앞에 pybo라는 네임스페이스를 붙여줬다.
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.