링크
URL 하드코딩
<li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li>
- 질문 상세를 위한 URL 링크이다.
- 이러한 URL 링크는 웹 프로그램이 발전할 때마다 수정될 가능성이 크다.
- 예)
- 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라는 네임스페이스를 붙여줬다.
728x90