반응형

@ 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' 을 사용

반응형

+ Recent posts