티스토리 뷰

지금까지는 하나의 파일에서 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>

테스트 서버를 실행시켰을 때 정상적으로 동작한다면 성공!


참고 자료

 

예제로 배우는 파이썬 프로그래밍 - URL 매핑

1. Django App URL 매핑 하나의 프로젝트 내에 여러 Django App이 존재한다면, 프로젝트 폴더 내의 메인 urls.py 파일 하나로 모든 URL 매핑을 하기 보다는 각각의 Django App 안에 urls.py 파일을 만들고 메인 urls.py 파일에서 각 Django App의 urls.py 파일로 URL 매핑을 위탁하게 할 수 있다. 이러한 URL 매핑 방식은 특히 다수의 App들을 포함하는 큰 프로젝트의 경우 편리한 방식이다. 아래

pythonstudy.xyz

 

첫 번째 장고 앱 작성하기, part 3 | Django 문서 | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

댓글