
Django 공부하기 ✨
참고 사이트 : 파이보 (점프 투 장고)
URL 별칭이 필요한 이유는?
- 실제 프로젝트에서 URL 리팩토링은 빈번하게 발생한다.
- URL 링크의 구조가 자주 변경된다면 템플릿에서 사용한 모든 URL들을 일일이 찾아가며 수정해야 하는 리스크가 발생한다.
- 이러한 문제점을 해결하기 위해 해당 URL에 대한 실제 링크 대신 링크의 주소가 1:1 매핑되어 있는 별칭을 사용 할 수 있다.
(1) 링크 주소 대신 URL 별칭 사용하기
- URL 매핑에 name 속성을 부여하면 된다.
// (1) 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'), // 추가된 항목
]
- http://localhost:8000/pybo/ URL은 index, http://localhost:8000/pybo/2와 같은 URL에는 detail 이라는 별칭을 부여한 것이다.
(2) 템플릿에서 URL 별칭 사용하기
- 하드 코딩 되어 있던 기존 /pybo/{{ question.id }} 링크를 {% url 'detail' question.id %}로 변경했다.
// (2) projects\mysite\templates\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 %}
- 위의 코드에서 question.id는 URL 매핑에 정의된 <int:question_id>에 전달해야 하는 값을 의미한다.
(3) URL 네임스페이스
- 현재는 하나의 앱만 사용중이지만 추후에 다른 앱이 프로젝트에 추가될 수도 있다.
- 이런 경우 다른 앱에서 동일한 URL 별칭을 사용하면 중복이 발생된다.
- 위와 같은 상황까지 고려해야하기 때문에 네임스페이스를 추가 하는 것이 좋다.
// (3-1) 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/ 페이지를 요청하면 아래와 같은 오류가 발생한다.

- 네임스페이스를 추가한 경우 발생하는 오류이다.
- 템플릿에 사용한 URL 별칭에도 네임스페이스를 지정해줘야 한다.
// (3-2) projects\mysite\templates\pybo\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 %}
- detail 앞에 pybo 라는 네임스페이스를 붙여줬다.
'Study > Django' 카테고리의 다른 글
| [Django] settings.py (0) | 2023.09.13 |
|---|---|
| [Django] 데이터 저장 (10) (0) | 2023.09.12 |
| [Django] 템플릿 언어 (0) | 2023.09.11 |
| [Django] 조회와 템플릿 (8) (0) | 2023.09.11 |
| [Django] 관리자 사용하기 (7) (0) | 2023.09.08 |