URL 하드코딩
URL 링크의 구조가 자주 변경된다면 템플릿에서 사용한 모든 URL들을 일일이 찾아가며 수정해야 하는 리스크가 발생한다. 이에 해당 URL에 대한 실제 링크 대신 링크의 주소가 1:1 매핑되어 있는 별칭을 사용해야 한다.
URL 별칭
링크의 주소 대신 별칭을 사용하려면 URL 매핑에 name 속성을 부여하면 된다.
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'),
]
템플릿에서 URL 별칭 사용하기
이렇게 pybo/urls.py 파일에 별칭을 추가하면 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 %}
URL 네임스페이스
pybo 앱 이외의 다른 앱이 프로젝트에 추가 될 수도 있을 텐데,
이런 경우 서로 다른 앱에서 동일한 URL 별칭을 사용하면 중복이 발생할 것이다.
이 문제를 해결하려면 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/ 페이지를 요청하면 다음과 같은 오류가 발생한다.
이 오류는 네임스페이스를 추가했기 때문에 발생한 오류이다.
이 오류를 해결하려면 detail 앞에 pybo 라는 네임스페이스를 붙여줘서
템플릿에서 사용한 URL 별칭에 네임스페이스를 다음과 같이 지정해야 한다.
{% url 'pybo:detail' question.id %}
'Django' 카테고리의 다른 글
(8) 부트스트랩 (0) | 2024.07.02 |
---|---|
(7) 데이터 저장 및 스태틱 (0) | 2024.07.02 |
(5) Pybo 질문 목록과 상세 기능 구현하기 (0) | 2024.07.02 |
(4) 장고 관리자 (1) | 2024.07.02 |
(3) 장고에서 모델 사용하기 (0) | 2024.07.01 |