이번에는 템플릿에서 사용한 URL하드코딩을 없애는 방법에 대해 알아보자. question_list.html 템플릿에 사용된 href값을 보자.
# question_list.html 템플릿의 href값 <li><a href="/pybo/{{ question.id}}/">{{ question.subject}}</a></li> |
"/pybo/{{ question.id }}"는 질문 상세를 위한 URL규칙이다. 하지만 이러한 URL규칙은 프로그램을 수정하면서 '/pybo/question/2' 또는 '/pybo/2/question/' 으로 수정될 가능성도 있다. 이런 식으로 URL규칙이 자주 변경된다면 템플릿에서 사용된 모든 href값들을 일일이 찾아 수정해야한다. 이런 문제를 해결하려면 해당 URL에 대한 실제 주소가 아닌 주소가 매핑된 URL별칭을 사용해야 한다.
URL별칭으로 URL 하드코딩 문제 해결하기
(1단계) pyno/urls.py 수정하여 URL 별칭 사용하기
템플릿의 href에 실제 주소가 아니라 URL 별칭을 사용하려면 우선 pybo/urls.py 파일을 수정해야 한다. path 함수에 있는 URL매핑에 name 속성을 부여하자.
# D:\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') ] |
이렇게 수정하면 실제 주소 /pybo/는 index라는 URL별칭이, /pybo/2/는 detail이라는 URL별칭이 생긴다.
(2단계) pybo/question_list.html 템플릿에서 URL 별칭 사용하기
1단계에서 만든 별칭을 템플릿에서 사용하기 위해 /pybo/{{ question.id }}를 {% url 'detail' question.id %}로 변경하자.
#D:\projects\mysite\templates\pybo\qustion_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 %} |
URL 네임스페이스 알아보기
여기서 한 가지 더 생각할 문제가 있다. 현재 프로젝트에서는 pybo 앱 하나만 사용하면 되지만, 이후 pybo 앱 이외의 다른 앱이 프로젝트에 추가될 경우 서로 다른 앱에서 같은 URL별칭을 사용할 경우 중복문제가 생긴다.
이 문제를 해결하려면 pybo/urls.py 파일에 네임스페이스라는 개념을 도입해야 한다. 네임스페이스는 쉽게 말해 각각의 앱이 관리하는 독립된 이름 공간을 말한다.
(1단계) pybo/urls.py에 네임스페이스 추가하기
pybo/urls.py 파일에 네임스페이스를 추가하려면 간단히 app_name 변수에 네임스페이스 이름을 저장하면 된다.
네임스페이스 이름으로 'pybo'를 저장했다.
# D:\projects\mysite\pybo\urls.py from django.urls import path from . import views app_name = 'pybo' urlpatterns = [ path('', views.index, name='index'), path('/', views.detail, name='detail') ] |
(2단계) 네임스페이스 테스트하기 - 오류 발생!
/pybo/에 접속해 보자/ 그러면 다음과 같은 오류가 발생한다.
NoReverseMatch at /pybo/
(3단계) pybo/question_list.html 수정하기
오류가 발생한 이유는 템플릿에서 아직 네임스페이스를 사용하고 있지 않기 때문이다.
* 수정: {% url 'detail' question.id %} ▶ {% url 'pybo:detail' question.id %}
#D:\projects\mysite\templates\pybo\qustion_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라는 네임스페이스를 붙여준 것이다.
이제 아래와 같이 정상적으로 출력될 것이다.
여기까지.
'개발자모드 > 혼자공부하는파이썬' 카테고리의 다른 글
[파이썬/장고#10] 웹페이지에 스타일시트(CSS) 적용하기 (ft. 스태틱 디렉터리, style.css) (0) | 2022.08.29 |
---|---|
[장고#09] 질문에 대한 답변 등록 기능 만들기 (답변저장, 답변조회) (0) | 2022.08.26 |
[장고#07] 질문 목록과 질문 상세 기능 구현 (ft. 템플릿등록, 화면추가, render 함수사용, URL매핑) (0) | 2022.08.23 |
[장고#06] 장고 Admin에서 모델 데이터 추가, 검색기능 추가 (0) | 2022.08.17 |
[장고#05] SQLite 설치, 장고ORM기능, 모델생성, 테이블 생성/저장/조회/수정/삭제 (ft. 장고에 앱등록하기, 장고 쉘shell 실행하기) (0) | 2022.08.16 |
댓글