Django4.0 URL調(diào)度器-包含其他的URLconfs

2022-03-16 17:42 更新

在任何時(shí)候,你的 ?urlpatterns都可以include其它URLconf 模塊。這實(shí)際上將一部分URL 放置于其它URL 下面。

例如,下面是URLconf Django website 自己的URLconf 中一個(gè)片段。它包含許多其它URLconf:

from django.urls import include, path

urlpatterns = [
    # ... snip ...
    path('community/', include('aggregator.urls')),
    path('contact/', include('contact.urls')),
    # ... snip ...
]

每當(dāng) Django 遇到 ?include()? ,它會(huì)將匹配到該點(diǎn)的URLconf的任何部分切掉,并將剩余的字符串發(fā)送到包含的URLconf進(jìn)行進(jìn)一步處理。

另一種可能性是通過使用 ?path()? 實(shí)例的列表來包含其他 URL 模式。比如,看這個(gè) URLconf:

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)),
]

在這個(gè)例子中, ?/credit/reports/? URL將被 ?credit.views.report()? 這個(gè)Django 視圖處理。

這種方法可以用來去除URLconf 中的冗余,其中某個(gè)模式前綴被重復(fù)使用。例如,考慮這個(gè)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),
]

我們可以改進(jìn)它,通過只聲明共同的路徑前綴一次并將后面的部分分組:

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),
    ])),
]

捕獲的參數(shù)

被包含的URLconf 會(huì)收到來自父URLconf 捕獲的任何參數(shù),所以下面的例子是合法的:

# In settings/urls/main.py
from django.urls import include, path

urlpatterns = [
    path('<username>/blog/', include('foo.urls.blog')),
]

# In foo/urls/blog.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.blog.index),
    path('archive/', views.blog.archive),
]

在上面的例子中,捕獲的?username?變量將被如期傳遞給?include()?指向的URLconf。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)