티스토리 뷰
지금까지는 하나의 파일에서 URLconf를 정의했지만 이제 2개의 파일로 나누어 정의하려고 합니다.
간단한 프로젝트에서는 하나의 파일에서 정의하는 것이 효율적일 수도 있습니다. 하지만 규모가 큰 프로젝트에서는
하나의 프로젝트 안에 여러 개의 앱이 포함되어 있어 URL pattern의 수가 굉장히 많아지기 때문에
2개의 파일로 나누어 정의하는 것이 훨씬 효율적입니다.
1. URLconf 2계층으로 나누기
URLconf는 다음과 같이 나누어집니다.
-
프로젝트 URL
: 프로젝트 전체를 정의. Django App의 urls.py로 분기.
-
앱 URL
: 앱마다 정의. Djnago 프로젝트에 생성된 App 마다 urls.py를 만들어 정의.
2. 프로젝트 urls.py 변경
현재 Django 프로젝트 폴더 아래에 있는 urls.py의 코드입니다.
from django.contrib import admin
from django.urls import path, re_path
from dkea.views import *
urlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^$', MainView, name='main'),
re_path(r'^list/(?P<c_code>c\d+)/$', ProductListView, name='list'),
re_path(r'^detail/(?P<p_id>\d+)/$', ProductDetailView, name='detail'),
]
이를 다음과 같이 바꿉니다.
from django.contrib import admin
from django.urls import path, re_path
from django.urls.conf import include
urlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^', include('dkea.urls')),
]
-
include()
: 다른 URLconf들을 참조할 수 있도록 도와주는 함수. Django가
include()
를 만나게 되면, 현재 매핑된 URL pattern과 일치하는 부분까지만 잘라내고, 남은 문자열 부분은 include 된 URLconf로 전달하여 처리.
3. 앱 urls.py 생성
앱 디렉토리 아래에 urls.py 파일을 생성합니다.
앱 urls.py 는 다음과 같이 작성합니다.
from django.urls import re_path
from .views import *
app_name = 'dkea'
urlpatterns = [
re_path(r'^$', MainView, name='main'),
re_path(r'^list/(?P<c_code>c\d+)/$', ProductListView, name='list'),
re_path(r'^detail/(?P<p_id>\d+)/$', ProductDetailView, name='detail'),
]
-
app_name
:
app_name
을 추가하여 Django app의 네임스페이스를 설정할 수 있음. 한 프로젝트 안에 같은이름의 url pattern 들이 존재하는 경우, 어떤 app의 url pattern 인지 구분할 수 있음.
(Django 2.0부터는
include()
의namespace
인자 대신app_name
을 사용)
4. template 파일 변경
urls.py의 url pattern의 이름공간이 바뀌었기 때문에 템플릿 파일의 {% url %} 도 바꿔줘야 합니다.
① main.html
<button onclick="window.location.href='{% url 'dkea:list' one.c_code %}'">{{one.c_name}}</button>
② product_list.html
<div class="productBox">
<div class="productImg">
<a href="{% url 'dkea:detail' one.p_id %}">
<img src="{{one.img_src}}" alt="상품 이미지" class="innerImg">
</a>
</div>
<div class="productInfo">
<a href="{% url 'dkea:detail' one.p_id %}"><h5>{{one.p_name}}</h5></a>
<p>{{one.price}}원</p>
</div>
</div>
테스트 서버를 실행시켰을 때 정상적으로 동작한다면 성공!
참고 자료
'Django' 카테고리의 다른 글
[Django Basic 07] settings.py에서 SECRET_KEY 분리하기 (0) | 2020.02.07 |
---|---|
[Django Basic 06] HttpResponse VS HttpResponseRedirect / render VS redirect (0) | 2020.01.30 |
[Django App 2-3] settings.py에서 MySQL 서버 연결 정보 분리하기 (0) | 2020.01.19 |
[Django Basic 04] Messages Framework (0) | 2020.01.16 |
[과제] 디케아 애플리케이션 개발 (0) | 2020.01.16 |
- Total
- Today
- Yesterday
- Django 프로젝트 생성
- Django
- Django 검색
- query parameter
- Django 업로드
- Django 컬렉션
- python
- 북마크 어플리케이션
- Django 좋아요
- 파이썬
- Django 회원 정보 수정
- Django 어플리케이션
- Redis Cache
- Django 인스타그램
- java
- Django User
- Django Instagram
- Django 비밀번호 수정
- Django 댓글
- Django 로그인
- MySQL
- Django application
- Django 로그아웃
- Django 회원가입
- Redis
- 서점 어플리케이션
- Django 팔로우
- Django 해시태그
- 장고
- Django 북마크
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |