@ path()
path(route, view, kwargs=None, name=None)
from django.urls import include, path
urlpatterns = [
path("index/", views.index, name="index"),
path("book/<name>/", views.book_detail, name="book_detail"),
path("articles/<slug:title>/", views.article, name="article-detail"),
path("articles/<slug:title>/<int:section>/", views.section, name="article-section"),
path("blog/", include("blog.urls")),
...,
]
@ re_path() - route에 regex 패턴을 적용
re_path(route, view, kwargs=None, name=None)
from django.urls import include, path
urlpatterns = [
re_path(r"^index/$", views.index, name="index"),
re_path(r"^book/(?P<name>\w+)/$", views.book_detail, name="book_detail"),
re_path(r"^blog/", include("blog.urls")),
...,
]
@ include()
include(module, namespace=None)
include(pattern_list)
include((pattern_list, app_namespace), namespace=None)
@ reverse()
reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
<app>/urls.py
from django.urls import include, path
from . import views
urlpatterns = [
path("test/", views.test, name="name-test")
]
<app>/views.py
from django.urls import reverse
from django.http import HttpResponse
def test(reqeust):
return HttpResponse("Hello World!")
# using the named URL
# will return "index/"
reverse("name-test")
# passing a callable object
# will return "index/"
reverse(test)
@ url namespace - case 1
<app>/urls.py
from django.urls import include, path
from . import views
app_name = "poll"
urlpatterns = [
path("test/", views.test, name="name-test")
]
<app>/views.py
from django.urls import reverse
from django.http import HttpResponse
def test(reqeust):
return HttpResponse("Hello World!")
# using the named URL with app_name
# will return "index/"
reverse("poll:name-test")
@ url namespace - case 2
<config>/urls.py
from django.urls import include, path
urlpatterns = [
path("poll/", include(("poll.urls", "url_name_space"))
]
include에 module 혹은 module name으로 매핑하는 경우에는 namespace는 <app>/urls.py 에 있는 app_name 이 우선 적용된다. 즉, <app>/urls.py 에 app_name 이 있으면 <app_name>:<path_name> 형식
ex) reverse("poll:name-test")
만약 <app>/urls.py 에 app_name이 없다면 <app_namespace>:<path_name> 이 된다.
ex) reverse("url_name_space:name-test")
@ url namespace - case 3
<config>/urls.py
from django.urls import include, path
from poll.urls import urlpatterns as poll_urlpatterns
urlpatterns = [
path("poll/", include((poll_urlpatterns, "url_name_space"))
]
include에 urlpattern 을 매핑하는 경우에는 <app>/urls.py 전체가 로딩되지 않고, <app>/urls.py/urlpatterns만 읽어서 등록하기 때문에, namespace는 <config>/urls.py 에 있는 app_namespace (여기서는 "url_name_space") 가 적용이 된다. <app_namespace>:<path_name> 형식
ex) reverse("url_name_space:name-test")
@ url in Django Template
Template 에서는 url 키워드를 이용해서 reverse와 같은 결과를 받아올 수 있다.
<a href="{% url 'poll:name-test' %}">Poll Test</a>
요약
1. python 코드에서는 url path를 가지고 오기 위해서는 reverse() 를 사용
2. reverse에서 사용하는 namespace는 include를 등록하는 방식에 따라서 약간 차이가 있음.
- urlpatterns 형식으로 등록했다면, 등록할 때 사용한 app_namespace를 적용
- module 혹은 module name 으로 등록했다면, 모듈에 있는 app_name이 우선 적용됨
3. Template 에서는 url path를 가지고 오기 위해서 'url' 을 사용
'프로그래밍 > Python - Django' 카테고리의 다른 글
Django Query Tips - User, Group, Permission (0) | 2024.03.02 |
---|---|
Django 프로젝트 배포하기 (0) | 2024.02.29 |
Django - Proxy Models (0) | 2023.02.23 |
Django Tutorial Part 1 - HelloWorld (0) | 2022.11.01 |
Django - 프로젝트 시작하기 (0) | 2022.10.28 |