장고 URL 설정 및 표기법
요약 정리. 수알치 오상문
<출처: https://docs.djangoproject.com/ko/3.2/topics/http/urls/ >
장고 URL 다루기¶
앱 URL을 설정하려면 URLconf (URL configuration) 파일을 다루어야 합니다(앱\urls.py).
Django request 절차¶
장고로 만들어진 사이트에 사용자가 페이지를 요청(request)하면 다음처럼 처리됩니다.
- Django는 사용할 루트 URLconf 모듈을 찾는다. 일반적으로 ROOT_URLCONF 설정 값이지만, 만약 들어오는 HttpRequest 객체에 urlconf 속성(미들웨서 설정됨)이 있으면 해당 값이 ROOT_URLCONF 대신에 사용됩니다.
- Django는 해당 파이썬 모듈을 읽고 변수 urlpatterns를 찾습니다. 이것은 django.urls.path() 및 django.urls.re_path() 인스턴스의 시퀀스(sequence)이어야 합니다.
- Django 각 URL 패턴을 살펴보고 요청된 URL,과 일치하는 것을 찾아서 동작합니다.
- URL 패턴 중 하나가 일치하면 Django는 Python 함수(또는 class-based view)인 지정된 뷰를 가져와 호출합니다. 뷰는 다음과 같은 아규먼트를 전달받습니다.
- HttpRequest 인스턴스
- 일치하는 URL 패턴에 명명된 그룹이 포함되지 않으면, 정규식의 일치 항목이 위치 인수로 제공됩니다.
- 키워드 인수는 제공된 경로 표현식과 일치하는 이름 부분으로 구성되며 django.urls.path() 또는 django.urls.re_path()에 대한 선택적 kwargs 인수에 지정된 인수로 재정의됩니다.
- 만약 URL 패턴이 일치하지 않거나 이 프로세스에서 예외가 발생하면 Django는 적절한 오류 처리 뷰를 호출합니다. 오류 처리(Error handling)를 참조하세요.
예제¶
URLconf 예제입니다(앱 articles의 urls.py).
from django.urls import path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
- 대괄호를 이용합니다.
- 변환형을 이용하여 값을 가져올 수 있습니다. 예를 들어, <int:name> 표기는 정수형으로 가져옵니다. 변환기(converter)가 포함되지 않은 경우 '/' 문자를 제외한 모든 문자열이 매칭됩니다.
- 모든 URL 앞에 슬래시('/')를 추가할 필요가 없습니다. 예를 들어, /articles가 아니라 articles입니다.
Request 예:
- /articles/2005/03/에 대한 요청은 목록의 세 번째 항목을 의미합니다. Django는 views.month_archive(request, year=2005, month=3) 함수를 호출합니다.
- /articles/2003/은 패턴이 순서대로 테스트되고 첫 번째 테스트에 통과하므로 두 번째 패턴이 아니라 첫 번째 패턴으로 동작합니다. 이점에 주의하면서 순서를 잘 활용하세요. 여기서 Django는 views.special_case_2003(request) 함수를 호출합니다.
- /articles/2003은 목록의 패턴과 일치하지 않습니다. 각 패턴은 URL이 슬래시로 끝나야 합니다(/articles/2003/).
- /articles/2003/03/building-a-django-site/는 가장 끝 패턴과 일치합니다. Django는 views.article_detail(request, year=2003, month=3, slug="building-a-django-site") 함수를 호출합니다.
경로 변환(Path converter)¶
기본적으로 다음과 같은 경로 변환기를 사용할 수 있습니다.
- str - 경로 구분 기호 '/'를 제외하고 비어 있지 않은 모든 문자열에 대응니다(문자열 반환). 표현식에 변환기가 포함되지 않은 경우 에는 str이 기본입니다.
- int - 0 또는 양의 정수에 대응니다. 즉, 0 이상의 정수를 반환합니다.
- slug - ASCII 문자 또는 숫자, 하이픈(대시 '-') 및 밑줄 문자로 구성된 모든 슬러그 문자열과 일치합니다. 예를 들어, build-your-1st-django-site 같은 문자열입니다. 보통은 SEO(검색 엔진 최적화)를 위한 정보를 위해 slug를 제공합니다.
- uuid - 형식이 지정된 UUID에 대응합니다. 여러 URL이 동일한 페이지에 매핑되는 것을 방지하려면 대시를 포함해야 하고 문자는 소문자여야 합니다. 예를 들면 075194d3-6885-417e-a8a8-6c931e272f00 입니다. UUID 인스턴스를 반환합니다.
path - 경로 구분 기호 '/'를 포함하여 비어 있지 않은 모든 문자열에 대응합니다. 이를 통해 str에서와 같이 URL 경로의 세그먼트가 아닌 완전한 URL 경로에 대응할 수 있습니다.
사용자 path 변환기 등록¶
더 복잡한 일치 요구 사항의 경우 고유한 경로 변환기를 정의할 수 있습니다. 변환기는 다음을 포함하는 클래스입니다.
- 정규식 클래스 속성(문자열).
- 일치하는 문자열을 뷰 함수에 전달할 유형으로 변환 처리하는 to_python(self, value) 메서드. (주어진 값을 변환할 수 없으면 ValueError를 발생시켜야 합니다. ValueError는 일치하지 않는 것으로 해석되며 결과적으로 다른 URL 패턴이 일치하지 않는 한 404 응답이 사용자에게 전송됩니다.)
- Python 타입을 URL에서 사용할 문자열로 변환 처리하는 to_url(self, value) 메소드. (주어진 값을 변환할 수 없으면 ValueError를 발생시켜야 합니다. ValueError는 일치하지 않는 것으로 해석되며 결과적으로 reverse()는 다른 URL 패턴이 일치하지 않는 한 NoReverseMatch를 발생시킵니다.)
- Django 3.1 변경사항: 일치하는 항목이 없음을 나타내기 위해 ValueError 발생 지원이 추가되었습니다.
예시:
class FourDigitYearConverter:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value
register_converter()를 사용하여 URLconf에 사용자 정의 변환기 클래스를 등록합니다.
from django.urls import path, register_converter
from . import converters, views
register_converter(converters.FourDigitYearConverter, 'yyyy')
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<yyyy:year>/', views.year_archive),
...
]
정규식 사용¶
경로 및 변환기 구문이 URL 패턴을 정의하기에 충분하지 않으면 정규식을 사용할 수 있습니다. 이 경우 path() 대신 re_path()를 사용합니다. Python 정규식에서 명명된 정규식 그룹 구문 형식법은 (?P<name>pattern)입니다. 여기서 name은 그룹 이름이고 pattern은 일치시킬 일부 패턴입니다. 앞에서 작성한 URLconf를 정규 표현식으로 지정한 예는 다음과 같습니다. 을 사용하여 다시 작성한 이전 의 예입니다(예제의 정규식 내용은 아래 참고 내용을 참조하세요).
from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
]
다음을 제외하고는 이전 예제와 거의 동일한 작업을 수행합니다.
- 일치하는 정확한 URL은 약간 제한됩니다. 예를 들어 연도는 정확히 4자리로 제한됩니다.
- 잡혀진 각 인수는 정규 표현식의 일치 유형에 관계없이 문자열 형태로 뷰에 전송됩니다.
path()에서 re_path()로 또는 그 반대로 전환할 때 뷰 인수의 유형이 변경될 수 있으므로 뷰를 변경해야 하는 경우도 있음에 주의합니다.
[참고]
^xxx : xxx로 시작한다.
yyy$ : yyy로 끝난다.
[0-9] : 숫자로 이루어지는 글자
{4} : 4글자
^articles/ : 'arcticles/'로 시작
(?P<year)[0-9]{4}/$ : 숫자 4자리 + '/'로 끝나고 4자리 값을 변수 year에 전달
뷰 인수 기본값 지정¶
views〉 인수에 대한 기본 매개변수를 지정할 수 있습니다. 다음은 URLconf 및 뷰의 예입니다.
# URLconf
from django.urls import path
from . import views
urlpatterns = [
path('blog/', views.page),
path('blog/page<int:num>/', views.page),
]
# View (blog/views.py)
def page(request, num=1): # num 기본 값 1 지정
# num에 따라 블로그 항목의 해당 페이지를 출력합니다.
위 예에서 두 URL 패턴은 동일한 뷰(views.page)를 가리키지만 첫 번째 패턴은 URL에서 아무 것도 잡아내지 않습니다. 첫 번째 패턴이 일치하면 page() 함수는 num에 대한 기본 인수 1을 사용합니다. 두 번째 패턴이 일치하면 page()는 확인된 num 값을 사용합니다.
에러 처리¶
Django가 요청된 URL과 일치하는 항목을 찾을 수 없거나 예외가 발생하면 오류 처리 뷰를 호출합니다.
이때 사용할 뷰는 4개 변수로 지정됩니다. 기본값은 대부분 프로젝트에 충분하지만 기본값을 재정의하여 추가 사용자 정의를 할 수 있습니다. customizing error views
이러한 값은 루트 URLconf에서 설정할 수 있습니다.
값은 호출 가능하거나 오류 조건을 처리하기 위해 호출되어야 하는 뷰에 대한 전체 Python imort 경로를 나타내는 문자열이어야 합니다. 변수는 다음과 같습니다.
- handler400 – 참조 django.conf.urls.handler400.
- handler403 – 참조 django.conf.urls.handler403.
- handler404 – 참조 django.conf.urls.handler404.
- handler500 – 참조 django.conf.urls.handler500.
다른 URLconf 포함하기¶
urlpattern은 다른 URLconf 모듈을 《include》할 수 있습니다. 이것은 다른 URL 아래에 있는 일련의 URL을 《root》합니다. 다음은 Django website 자체에 대한 URLconf의 일부입니다. 여기서는 여러 URLconf가 포함됩니다.
from django.urls import include, path
urlpatterns = [
# ... 생략 ...
path('community/', include('aggregator.urls')),
path('contact/', include('contact.urls')),
# ... 생략 ...
]
Django는 include()를 만날 때마다 해당 지점까지 일치하는 URL 부분을 잘라내고 추가 처리를 위해 포함된 URLconf에 나머지 문자열을 보냅니다.
또 다른 방법은 path() 인스턴스 목록을 사용하여 추가 URL 패턴을 포함하는 것입니다. 예를 들어 다음과 같습니다.
from django.urls import include, path
from apps.main import views as main_views
from credit import views as credit_views
extra_patterns = [
path('reports/', credit_views.report),
path('reports/<int:id>/', credit_views.report),
path('charge/', credit_views.charge),
]
urlpatterns = [
path('', main_views.homepage),
path('help/', include('apps.help.urls')),
path('credit/', include(extra_patterns)),
]
이 예에서 /credit/reports/ URL은 credit_views.report() Django 뷰에 의해 처리됩니다. 이것은 단일 패턴 접두사가 반복적으로 사용되는 URLconf에서 중복을 제거하는 데 사용할 수 있습니다. 예를 들어 다음과 같습니다.
from django.urls import path
from . import views
urlpatterns = [
path('<page_slug>-<page_id>/history/', views.history),
path('<page_slug>-<page_id>/edit/', views.edit),
path('<page_slug>-<page_id>/discuss/', views.discuss),
path('<page_slug>-<page_id>/permissions/', views.permissions), ]
공통된 경로 접두사를 한 번만 지정하고 다른 접미사를 그룹화하여 이를 개선할 수 있습니다.
from django.urls import include, path
from . import views
urlpatterns = [
path('<page_slug>-<page_id>/',
include( [ path('history/', views.history),
path('edit/', views.edit),
path('discuss/', views.discuss),
path('permissions/', views.permissions),
])
),
]
확인된 인수(Captured parameters)¶
포함된 URLconf는 상위 URLconf에서 확인된 인수를 전달받으므로 다음처럼 작성할 수 있습니다.
# settings/urls/main.py
from django.urls import include, path
urlpatterns = [
path('<username>/blog/', include('foo.urls.blog')),
]
# foo/urls/blog.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.blog.index),
path('archive/', views.blog.archive),
]
위의 예에서 확인된 "username" 변수는 포함된 URLconf에 전달됩니다.
뷰 함수에 추가 옵션 전달하기¶
URLconf에는 추가 인수를 Python 사전으로 뷰 함수에 전달할 수 있는 후크(hook)가 있습니다.
path() 함수는 뷰 함수에 전달할 사전 형태의 추가 키워드 인수 즉, 선택적인 세 번째 인수를 사용할 수 있습니다.
예시:
from django.urls import path
from . import views
urlpatterns = [
path('blog/<int:year>/', views.year_archive, {'foo': 'bar'}),
]
예에서 /blog/2005/에 대한 요청에 대해 Django는 views.year_archive(request, year=2005, foo='bar')를 호출합니다. 이 기술은 메타 데이터와 옵션을 뷰에 전달하기 위해 신디케이션 프레임워크(syndication framework)에서 사용됩니다.
명명된 키워드 인수를 확인했는데 추가 인수 사전에 동일한 이름을 가진 인수를 전달하는 URL 패턴을 가질 수 있습니다. 이 경우 URL에 캡처된 인수 대신 사전 인수가 사용됩니다.
include()에 추가 옵션 전달¶
마찬가지로 nclude()에 추가 옵션을 전달할 수 있으며 포함된 URLconf의 각 줄에는 추가 옵션이 전달됩니다. 예를 들어, 다음 두 URLconf 방법은 동일하게 동작합니다.
방법 1:
# main.py
from django.urls import include, path
urlpatterns = [
path('blog/', include('inner'), {'blog_id': 3}),
]
# inner.py
from django.urls import path
from mysite import views
urlpatterns = [
path('archive/', views.archive), path('about/', views.about),
]
방법 2:
# main.py
from django.urls import include, path
from mysite import views
urlpatterns = [
path('blog/', include('inner')),
]
# inner.py
from django.urls import path
urlpatterns = [
path('archive/', views.archive, {'blog_id': 3}),
path('about/', views.about, {'blog_id': 3}),
]
추가 옵션은 줄의 뷰가 실제로 해당 옵션을 유효한 것으로 수락하는지 여부에 관계없이 포함된 URLconf의 모든 줄에 항상 전달됩니다. 이러한 이유로 이 기술은 포함된 URLconf의 모든 뷰가 전달하는 추가 옵션을 수락한다고 확신하는 경우에만 유용합니다.
URL의 Reverse resolution¶
Django 프로젝트에서 작업할 때 일반적으로 필요한 것은 생성된 콘텐츠(뷰 및 asset URL, 사용자에게 표시되는 URL 등)에 포함하거나 서버에서 탐색 흐름을 처리하기 위해 최종 URL을 얻는 것입니다. (redirect 등)
- 사용자/브라우저가 요청한 URL로 시작하여 URL에서 추출한 값과 함께 필요한 인수를 제공하는 올바른 Django 뷰를 호출합니다.
- 해당 Django 뷰의 식별과 여기에 전달될 인수 값으로 시작하여 연결된 URL을 얻습니다.
첫 번째는 이전에 살펴본 사용법입니다. 두 번째는 URL의 역방향 확인, 역방향 URL 일치, 역방향 URL 조회 또는 단순히 URL 역방향(reversing)으로 알려진 것입니다.
Django는 URL이 필요한 다른 레이어와 대응하는 URL reversing을 수행하기 위한 도구를 제공합니다.
Django 모델 인스턴스의 URL 처리와 관련된 상위 수준 코드: get_absolute_url() 메소드
예제¶
아래 URLconf 항목을 다시 고려하세요.
from django.urls import path
from . import views
urlpatterns = [
#...
path('articles/<int:year>/', views.year_archive, name='news-year-archive'),
#...
]
이 방식에 따르면 연도 nnnn에 해당하는 보관소(archive)의 URL은 /articles/<nnnn>/입니다. 다음을 사용하여 템플릿 코드에서 이것을 얻을 수 있습니다.
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
{# Or with the year in a template context variable: #}
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>
또는 Python 코드:
from django.http import HttpResponseRedirect
from django.urls import reverse
def redirect_to_year(request):
# ...
year = 2006
# ...
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
만약 연간 기사 보관소의 콘텐츠가 게시되는 URL을 변경해야 하는 경우 URLconf의 항목만 변경하면 됩니다.
뷰가 일반 특성을 갖는 일부 시나리오에서는 URL과 뷰 간에 다대일 관계가 존재할 수 있습니다. 이 경우 URL을 reverse 할 때 뷰 이름은 충분한 식별자가 아닙니다. Django가 이를 위해 제공하는 해결 방안에 대해 알아보려면 다음 섹션을 읽으십시오.
URL 패턴 이름 지정¶
URL reverse를 수행하려면 위 예와 같이 명명된 URL 패턴(named URL patterns)을 사용해야 합니다. URL 이름에 사용되는 문자열에는 원하는 모든 문자가 포함될 수 있습니다. 유효한 Python 이름으로 제한되지 않습니다.
URL 패턴 이름은 다른 애플리케이션과 충돌 가능성이 없는 이름을 선택해야 합니다. URL 패턴 comment를 호출하고 다른 응용 프로그램이 같은 작업을 수행하는 경우 reverse()가 찾는 URL은 프로젝트의 urlpatterns 목록에서 마지막 패턴에 따라 달라집니다.
애플리케이션 이름에서 파생된 URL 이름에 접두사를 추가하면(예: comment 대신 myapp-comment으로 사용) 충돌 가능성이 줄어듭니다.
뷰를 재정의하는 경우 의도적으로 다른 응용 프로그램과 동일한 URL 이름을 선택할 수 있습니다. 예를 들어 LoginView를 재정의하는 것입니다. Django 및 대부분의 타사 앱의 일부는 이 뷰에 이름이 login인 URL 패턴이 있다고 가정합니다. 사용자 정의 로그인 뷰가 있고 URL에 로그인 이름을 지정하면 django.contrib.auth.urls가 포함된 후 urlpatterns에 있는 한 reverse()는 사용자 정의 뷰를 찾습니다(모두 포함된 경우).
인수가 다른 경우 여러 URL 패턴에 동일한 이름을 사용할 수 있습니다. URL 이름 외에 reverse()는 인수 수와 키워드 인수 이름을 일치시킵니다. 경로 변환기는 일치하지 않을 때 ValueError를 발생시킬 수도 있습니다. 자세한 내용은 Registering custom path converters을 참조하세요.
URL 네임스페이스(namespaces) 사용¶
URL 네임스페이스를 사용하면 다른 응용 프로그램에서 동일한 URL 이름을 사용하는 경우에도 명명된 URL 패턴(named URL patterns)을 해석할 수 있습니다. 타사 앱은 항상 네임스페이스 URL을 사용하는 것이 좋습니다(튜토리얼에서 했던 것처럼). 마찬가지로 애플리케이션의 여러 인스턴스가 배포된 경우 URL을 반전할 수도 있습니다. 즉, 단일 애플리케이션의 여러 인스턴스가 명명된 URL을 공유하므로 네임스페이스는 이러한 명명된 URL을 구분하는 방법을 제공합니다. URL 네임스페이스를 적절히 사용하는 Django 애플리케이션은 특정 사이트에 대해 두 번 이상 배포(deploy more than one instance of the admin) 할 수 있습니다. 예를 들어 django.contrib.admin에는 둘 이상의 관리자 인스턴스를 배포할 수 있는 AdminSite 클래스가 있습니다. 나중의 예에서 우리는 두 개의 다른 청중(저자와 발행자)에게 동일한 기능을 제공할 수 있도록 튜토리얼의 투표 응용 프로그램을 두 개의 다른 위치에 배포하는 아이디어에 대해 논의할 것입니다. URL 네임스페이스는 두 부분으로 나뉩니다. 둘 다 문자열입니다. 애플리케이션 네임스페이스 배포 중인 애플리케이션의 이름을 설명합니다. 단일 애플리케이션의 인스턴스는 동일한 애플리케이션 네임스페이스를 갖습니다. 예를 들어 Django의 admin 애플리케이션에는 'admin'이라는 애플리케이션 네임스페이스가 있습니다.
instance namespaceThis는 애플리케이션의 특정 인스턴스를 식별합니다. 인스턴스 네임스페이스는 전체 프로젝트에서 고유해야 합니다. 그러나 인스턴스 네임스페이스는 애플리케이션 네임스페이스와 동일할 수 있습니다. 애플리케이션의 기본 인스턴스를 지정하는 데 사용됩니다. 예를 들어 기본 Django admin 인스턴스에는 'admin'의 인스턴스 네임스페이스가 있습니다. 네임스페이스 URL은 ':' 연산자를 사용하여 지정됩니다. 예를 들어 admin 응용 프로그램의 기본 색인 페이지는 'admin:index'를 사용하여 참조됩니다. 이는 'admin'의 네임스페이스와 'index'의 명명된 URL을 나타냅니다. 네임스페이스도 중첩될 수 있습니다. 이름이 지정된 URL 'sports:polls:index'는 최상위 네임스페이스 'sports' 내에 정의된 'polls' 네임스페이스에서 'index'라는 패턴을 찾습니다.
예제¶
설문 조사 애플리케이션 polls의 두 가지 예를 살펴보겠습니다. 하나는 'author-polls'이고 다른 하나는 'publisher-polls'입니다. 설문을 생성하고 표시할 때 인스턴스 네임스페이스를 고려하도록 해당 애플리케이션을 변경했다고 가정합니다.
urls.py¶
from django.urls import include, path
urlpatterns = [
path('author-polls/', include('polls.urls', namespace='author-polls')),
path('publisher-polls/', include('polls.urls', namespace='publisher-polls')),
]
polls/urls.py¶
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
# ...
]
이 설정을 사용하면 다음 조회가 가능합니다.
- 인스턴스 중 하나가 현재 존재하는, 예를 들어 'author-polls'라면, 인스턴스의 세부 정보 페이지를 렌더링하는 경우 - 'polls:index'는 'author-polls' 인스턴스의 index 페이지로 해석됩니다. 즉, 다음 두 가지 모두 "/author-polls/".reverse('polls:index', current_app=self.request.resolver_match.namespace)가 됩니다.
- {% url 'polls:index' %}
- 그리고 템플릿에서:
- 그리고 클래스 기반 뷰 템플릿에서:
- 현재 인스턴스가 없는 경우(예를 들어 사이트 다른 위치에서 페이지를 렌더링하는 경우) 'polls:index'는 마지막으로 등록된 투표 인스턴스로 확인됩니다. 기본 인스턴스('polls'의 인스턴스 네임스페이스)가 없으므로 등록된 투표의 마지막 인스턴스가 사용됩니다. 이것은 urlpatterns에서 마지막으로 선언되었기 때문에 'publisher-polls'가 됩니다.
- 'author-polls:index'는 항상 'author-polls' 인스턴스의 index 페이지로 해석됩니다('publisher-polls'의 경우도 마찬가지입니다).
기본 인스턴스(즉, 'polls'라는 이름의 인스턴스)가 있는 경우 현재 인스턴스(위 목록의 두 번째 항목)가 없는 경우에만 위에서 변경됩니다. 이 경우 'polls:index'는 urlpatterns에서 마지막으로 선언된 인스턴스 대신 기본 인스턴스의 인덱스 페이지로 해석됩니다.
URL 네임스페이스와 URLconf 포함¶
URLconf를 포함한 애플리케이션 네임스페이스는 두 가지 방법으로 지정할 수 있습니다.
한 가지 방법으로는, urlpatterns 속성과 동일한 수준에서 포함된 URLconf 모듈에 app_name 속성을 설정할 수 있습니다. 실제 모듈 또는 모듈에 대한 문자열 참조를 urlpatterns 자체 목록이 아니라 include()에 전달해야 합니다.
polls/urls.py¶
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
# ...
]
urls.py¶
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
]
polls.urls에 정의된 URL들은 애플리케이션 네임스페이스 polls를 갖습니다.
다른 방법으로는, 삽입된 네임스페이스를 가진 객체를 포함할 수도 있습니다. path() 또는 re_path() 인스턴스 목록을 include()하면 해당 객체에 포함된 URL이 전역 네임스페이스에 추가됩니다. 다음을 포함하는 2-튜플을 include() 할 수도 있습니다. (<list of path()/re_path() instances>, <application namespace>)
예:
from django.urls import include, path
from . import views
polls_patterns = ( [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'), ],
'polls')
urlpatterns = [
path('polls/', include(polls_patterns)),
]
여기에는 지정된 애플리케이션 네임스페이스에 지정된 URL 패턴이 포함됩니다. 인스턴스 네임스페이스는 include()에 대한 네임스페이스 인수를 사용하여 지정할 수 있습니다. 인스턴스 네임스페이스가 지정되지 않으면 기본적으로 포함된 URLconf의 애플리케이션 네임스페이스가 됩니다. 즉, 해당 네임스페이스의 기본 인스턴스가 된다는 것을 의미합니다.
<이상>
'Django' 카테고리의 다른 글
장고(Django) 데이터셋(Data set), DB에서 화면까지 (0) | 2021.08.29 |
---|---|
파이썬 장고 오픈소스 쇼핑몰 설치해보기 (0) | 2021.08.29 |
장고 기초와 프로젝트 설계 동영상 (0) | 2021.08.24 |
장고(Django) Localhost에 HTTPS 적용하기 (0) | 2021.08.20 |
장고(Django) 게시판 노코드(No-code) (0) | 2021.08.20 |