이번 포스팅에서는 템플릿에서 사용된 URL의 하드코딩을 없애는 방법에 대해서 알아보자.
URL 하드 코딩
먼저 question_list.html 템플릿에 사용된 다음 링크를 보자.
<li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li> |
이전에 작성한 question_list 의 템플릿 파일에 작성된 내용 중 일부이다. 하지만 URL은 프로그램을 보완하고 개발하는 과정에서 수정될 가능성이 크다. 예를 들어서 pybo/question/2 또는 pybo/2/question 처럼 바뀔 수 있기 때문
이러한 문제를 해결하기 위해서 URL에 대한 실제 링크 대신 링크의 주소가 매핑되어 있는 별칭을 사용해야함
URL 별칭
링크의 주소 대신 별칭을 사용하기 위해서는 URL 매핑에 name 속성을 부여해야한다
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/ 에는 name 속성으로 index라는 이름을 붙여주었고
pybo/question_id 에는 detail 이라는 이름을 부여했다.
이 별칭들을 사용해서, 템플릿을 작성하면
{% if question_list %} <ul> {% for question in question_list %} <li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li> {% endfor %} </ul> {% else %} <p>질문이 없습니다.</p> {% endif %} |
/pybo/{{ question.id }} 의 링크를 {% url 'detail' question.id %} 로 사용 할 수 있다.
path('<int:question_id>/', views.detail, name='detail'),
detail 속성의 링크는 pybo/question_id인데 왜 또 끝에 question.id가 있을까?
url매핑에 넣어줄 <int:question_id>에 넣어줄 전달해야하는 값을 의미하는것 이다.
URL 네임스페이스
그런데 한가지 더 생각해 볼 문제가 있다. 현재는 pybo 앱 하나만 사용중이지만 pybo 앱 이외의 다른 앱이 프로젝트에 추가 될 수도 있을 것이다. 이런 경우 서로 다른 앱에서 동일한 URL 별칭을 사용하면 중복이 발생할 것이다.
이 문제를 해결하려면 pybo/urls.py 파일에 네임스페이스를 의미하는 app_name 변수를 지정해야한다.
다음처럼 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/ 페이지를 요청하면 다음과 같은 오류가 발생한다.
오류를 발생시키지 않기 위해서는 템플릿파일에 pybo:detail 이라고 지정해준다. 즉 pybo 앱에서의 url 별칭을 사용하겠다는 뜻이다.
'개인 공부 > 개발' 카테고리의 다른 글
부트스트랩과 html (0) | 2021.08.08 |
---|---|
장고 데이터 저장과 스타일 시트 (0) | 2021.08.05 |
장고 조회와 템플릿 (0) | 2021.08.04 |
장고 관리자 (0) | 2021.08.02 |
장고의 기본 요소(url과 view) (0) | 2021.07.29 |
댓글