W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
URL 命名空間允許你使用唯一的反向命名URL模式( named URL patterns ),即便不同應(yīng)用程序使用相同的 URL 名稱。對(duì)于第三方應(yīng)用程序來說,始終使用 URL 命名空間是個(gè)好習(xí)慣(像在教程里說的那樣)。同樣,如果已部署了應(yīng)用程序的多個(gè)實(shí)例,它也允許你反向解析 URL。換句話說,因?yàn)閱蝹€(gè)應(yīng)用的多個(gè)實(shí)例會(huì)分享已命名的 URL,命名空間提供了區(qū)分這些已命名 URL 的方法。
對(duì)于特定站點(diǎn),正確使用URL名稱空間的Django應(yīng)用程序可以部署多次。比如 ?django.contrib.admin
? 有一個(gè) ?AdminSite
?,它允許admin實(shí)例部署多次。
URL 命名空間分為兩部分,它們都是字符串:
這描述了正在部署的程序名。單個(gè)應(yīng)用的每個(gè)實(shí)例擁有相同的命名空間。比如,Django admin 應(yīng)用有可預(yù)測(cè)的應(yīng)用命名空間 ?'admin'
? 。
這標(biāo)識(shí)了應(yīng)用程序的特定實(shí)例。實(shí)例命名空間應(yīng)該是完整項(xiàng)目唯一的。但是實(shí)例命名空間可以和應(yīng)用命名空間相同。這常用來指定應(yīng)用的默認(rèn)實(shí)例。比如,默認(rèn)Django admin 實(shí)例擁有名為?'admin'
? 的實(shí)例命名空間。
被指定的命名空間 URL 使用 ?':'
? 操作符。比如,使用 ?'admin:index'
? 引用admin 應(yīng)用的首頁。這表明命名空間為 ?'admin'
? ,命名 URL 為 ?'index'
? 。
命名空間也可以嵌套。命名 URL ?'sports:polls:index'
? 將在命名空間 ?'polls'
? 中尋找命名為 ?'index'
? 的模式,該模式是在頂層命名空間 ?'sports'
? 中定義的。
當(dāng)給定一個(gè)命名空間 URL(例如 ?'polls:index'
? )解析時(shí),Django 會(huì)將完全限定的名稱拆分成多個(gè)部分,然后嘗試下面的查詢:
application namespace
? (這個(gè)例子里是 ?'polls'
? )。這將產(chǎn)生應(yīng)用實(shí)例列表。
reverse()
? 函數(shù)的 ?current_app
參數(shù)來指定當(dāng)前應(yīng)用程序。url 模板標(biāo)簽使用當(dāng)前已解析的視圖命名空間當(dāng)作 ?RequestContext
中的應(yīng)用程序。你可以通過設(shè)置在 ?request.current_app
? 屬性上的當(dāng)前應(yīng)用來覆蓋這個(gè)默認(rèn)配置。polls
?實(shí)例被稱為 ?'polls'
? )。
如果有嵌套的命名空間,則會(huì)對(duì)命名空間的每個(gè)部分重復(fù)這些步驟,直到視圖名不被解析為止,然后視圖名稱將被解析為已找到的命名空間中的一個(gè) URL 。
例如:
為了展示這個(gè)解決策略的實(shí)際作用,請(qǐng)考慮教程里 ?polls
應(yīng)用程序的兩個(gè)實(shí)例案例:分別被稱為 ?'author-polls'
? 和 ?'publisher-polls'
? 。假設(shè)我們已經(jīng)增強(qiáng)了這個(gè)應(yīng)用程序,以便會(huì)在創(chuàng)建和顯示 ?polls
時(shí)考慮實(shí)例命名空間
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')),
]
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'),
...
]
使用這步后,可以進(jìn)行以下查找:
如果我們?cè)趯?shí)例 ?'author-polls'
? 中渲染詳情頁 - ?'polls:index'
? 將解析為 ?'author-polls'
? 的首頁;比如下面兩種都將觸發(fā) ?"/author-polls/"
? 。
在基于類的視圖里的方法:
reverse('polls:index', current_app=self.request.resolver_match.namespace)
在模板中:
{% url 'polls:index' %}
如果我們?cè)谡军c(diǎn)某處渲染一個(gè)頁面 - ?'polls:index'
? 將被解析為 ?polls
的最后一個(gè)注冊(cè)實(shí)例。因?yàn)檫@里沒有默認(rèn)實(shí)例( ?'polls'
? 的實(shí)例命名空間),所以將使用 ?polls
的最后一個(gè)注冊(cè)實(shí)例。這將是 ?'publisher-polls'
? ,因?yàn)樗窃?nbsp;?urlpatterns
? 的最后面聲明的。
?'author-polls:index'
? 會(huì)一直被解析為實(shí)例 ?'author-polls'
? 的首頁(對(duì)于 ?'publisher-polls'
? 同樣如此)。
如果還有一個(gè)默認(rèn)實(shí)例 - 例如,一個(gè)叫 ?'polls'
? 的實(shí)例 - 唯一的變化就是沒有當(dāng)前實(shí)例(上面列表中的第二項(xiàng))。在這個(gè)例子 ?'polls:index'
? 將解析為默認(rèn)實(shí)例的首頁而不是在 ?urlpatterns
中最后聲明的實(shí)例。
有兩種辦法指定包含的URLconfs應(yīng)用程序空間。
首先,你可以在包含的 URLcon 模塊中設(shè)置一個(gè) ?app_name
? 屬性,在相同層作為 ?urlpatterns
屬性。你必須傳遞實(shí)際的模塊或?qū)υ撃K的一個(gè)字符串引用傳遞給 ?include()
? ,而不是 ?urlpatterns
?本身的列表。
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'),
...
]
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
]
?polls.urls
? 里的 URLs 定義將具有應(yīng)用程序命名空間 ?polls
。
其次,你可以包括一個(gè)包含嵌入式命名空間數(shù)據(jù)的對(duì)象。如果你 ?include()
? 了一個(gè) ?path()
? 或 ?re_path()
? 實(shí)例的列表,那個(gè)對(duì)象里包含的 URLs 將被添加到全局命名空間內(nèi)。但是,你也可以 ?include()
? 一個(gè)包含以下內(nèi)容的2元組:
(<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)),
]
這會(huì)將指定的 URL 模式包含到給定的應(yīng)用程序命名空間里。
使用 ?include()
? 的 ?namespace
?參數(shù)來指定實(shí)例命名空間。如果實(shí)例命名空間沒有被指定,會(huì)默認(rèn)已被導(dǎo)入的 URLconf 的應(yīng)用程序命名空間。這意味著它也將成為那個(gè)命名空間的默認(rèn)實(shí)例。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: