<li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li>
질문 상세를 위한 URL 링크이다. 하지만 이러한 URL 링크는 수정될 가능성이 있다. 예를 들어,
http://localhost:8000/pybo/question/2 또는 http://localhost:8000/pybo/2/question 처럼 바뀔수 있다.
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')
]
#http://localhost:8000/pybo/ == index
#http://localhost:8000/pybo/2 == detail
**파라미터명 전달
{% url 'detail' question.id %}
#파라미터 명을 함께 사용할 수 있다.
{% url 'detail' question_id = question.id %}
#만약 2개 이상의 파라미터를 사용해야 한다면 다음과 같이 공백 문자 이후에 적어주면 된다.
#{% url 'detail' question_id = question.id page = 2%}
#URL 네임스페이스
현재 pybo 앱 하나만 사용 중이지만 pybo 앱 이외의 다른 앱이 프로젝트에 추가될 수 있다.
이런 경우 서로 다른 앱에서 동일한 URL 별칭을 사용하면 중복이 발생할 것이다.
이 문제를 해결하려면 pybo/urls.py 파일에 네임스페이스를 의미하는 app_name 변수를 지정해야한다.
#pybo/urls.py
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'),
]
#question_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 %}
**redirect
redirect 는 특정 페이지로 이동시키는 함수이다.
redirect('pybo:detail', question_id=question.id)
[Django] 스태틱(static) 디렉터리, 스타일시트 등록하기 (0) | 2022.09.18 |
---|---|
[Django] 데이터 저장 (복습필요) (0) | 2022.09.16 |
[Django] 질문 목록 및 상세 페이지 만들기 (0) | 2022.09.16 |
[Django] 모델(Model) (15) | 2022.09.15 |
[Django] 장고 관리자 (admin) (1) | 2022.09.15 |