Django 점프 투 장고 정리
작성일 : 2021-11-11
문서버전 : 1.0
개요
이 문서는 점프 투 장고 사이트의 장고 튜토리얼 학습 내용을 정리한 내용입니다.
레퍼런스
점프 투 장고 https://wikidocs.net/72242
2-5. URL과 네임스페이스
템플릿에서 사용된 URL의 하드코딩을 없애는 방법을 알아보자.
URL 하드코딩
> question_list.html
<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 링크 대신 링크의 주소가 매핑된 별칭을 사용해야 한다.
URL 별칭
> 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'),
]
별칭 ‘index’ - http://localhost:8000/pybo/
별칭 ‘detail’ - http://localhost:8000/pybo/2
템플릿에서 URL 별칭 사용하기
위에서 pybo/urls.py의 파일에 별칭을 추가해주었으니, 템플릿에서 해당 URL 별칭을 사용할 수 있게 되었다.
> ../projects/mysite/templates/pybo/question_list.html
기존
{% if question_list %}
<ul>
{% for question in question_list %}
<li><a href="/pybo/{{question.id}}/"/>{{question.subject}}</a></li>
{% endfor %}
</ul>
{% else %}
<p>What can we ask?</p>
{% endif %}
수정(별칭 추가)
{% if question_list %}
<ul>
{% for question in question_list %}
<li><a href="{% url 'detail' question.id %}"/>{{question.subject}}</a></li>
{% endfor %}
</ul>
{% else %}
<p>What can we ask?</p>
{% endif %}
하드코딩된 링크가 수정되었다. 여기서 question.id는 <int:question_id>에 전달해야 하는 값을 의미한다.
URL 네임스페이스
Pybo 앱 하나만 사용중이지만 pybo 앱 이외 다른 앱이 프로젝트에 추가될 수 있다. 다른 앱에서 동일한 URL별칭을 사용하면 중복이 발생한다. 이를 해결하기 위해 pybo/urls.py 파일에 네임스페이스 의미하는 app_name 변수를 지정한다.
네임스페이스 의미하는 app_name 변수는 다른 앱들간 동일한 URL 별칭 사용으로 인해 발생하는 중복을 방지하기 위함!
> ../projects/mysite/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'),
]
app_name을 pybo로 설정했다. 이렇게 수정하고 http://localhost:8000/pybo/ 페이지 요청하면 아래와 같이 오류가 발생한다.
> ../projects/mysite/templates/pybo/question_list.html
위 오류를 해결하기 위해 템플릿에서 사용한 URL별칭에 네임스페이스를 아래와 같이 지정한다.
{% 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 %}
{% url ‘detail’ question.id %}을 {% url ‘pybo:detail’ question.id %}으로 바꾸어 주었다. Detail 앞에 pybo라는 네임스페이스를 붙여준 것이다.
URL별칭은 템플릿 외 redirect함수에서도 사용된다. 아래 redirect 함수의 사용은 추후에 공부한다. ex) redirect(‘pybo:detail’, question_id=question.id)
'Research > Django' 카테고리의 다른 글
[Django] 점프 투 장고 튜토리얼 - 02-7. 스태틱 (0) | 2021.11.11 |
---|---|
[Django] 점프 투 장고 튜토리얼 - 02-6. 데이터 저장 (0) | 2021.11.11 |
[Django] 점프 투 장고 튜토리얼 - 02-4. 조회와 템플릿(template) (0) | 2021.11.11 |
[Django] 점프 투 장고 튜토리얼 - 02-3. 장고 관리자(Admin) (0) | 2021.11.11 |
[Django] 점프 투 장고 튜토리얼 - 02-2. 모델(Model) (0) | 2021.11.10 |
댓글