W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
如果路徑和轉(zhuǎn)化器語法不能很好的定義你的 URL 模式,你可以可以使用正則表達(dá)式。如果要這樣做,請使用 ?re_path()
? 而不是 ?path()
? 。
在 Python 正則表達(dá)式中,命名正則表達(dá)式組的語法是 ?(?P<name>pattern)
? ,其中 ?name
?是組名,?pattern
?是要匹配的模式。
這里是先前 ?URLconf
?的一些例子,現(xiàn)在用正則表達(dá)式重寫一下:
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),
]
這實(shí)現(xiàn)了與前面示例大致相同的功能,除了:
當(dāng)從使用 ?path()
? 切換到 ?re_path()
? (反之亦然),要特別注意,視圖參數(shù)類型可能發(fā)生變化,你可能需要調(diào)整你的視圖。
還有命名組語法,例如 ?(?P<year>[0-9]{4})
? ,你也可以使用更短的未命名組,例如 ?([0-9]{4})
? 。
不是特別推薦這個(gè)用法,因?yàn)樗鼤菀自谄ヅ涞念A(yù)期含義和視圖參數(shù)之間引發(fā)錯(cuò)誤。
在任何情況下,推薦在給定的正則表達(dá)式里只使用一個(gè)樣式。當(dāng)混雜兩種樣式時(shí),任何未命名的組都會被忽略,而且只有命名的組才會傳遞給視圖函數(shù)。
正則表達(dá)式允許嵌套參數(shù),Django 將處理它們并傳遞給視圖。當(dāng)轉(zhuǎn)換時(shí),Django 將試著填充給所有外部捕捉參數(shù),忽略任何嵌套捕捉參數(shù)??紤]下面可選的帶有頁面參數(shù)的 URL 模式:
from django.urls import re_path
urlpatterns = [
re_path(r'^blog/(page-(\d+)/)?, blog_articles), # bad
re_path(r'^comments/(?:page-(?P<page_number>\d+)/)?, comments), # good
]
兩個(gè)模式使用嵌套參數(shù),并處理:例如, ?blog/page-2/
? 將匹配給 ?blog_articles
? 并帶有2個(gè)參數(shù):?page-2/
? 和 ?2
?。第二個(gè)模式為 ?comments
?匹配 ?comments/page-2/
? 并帶有設(shè)置為2的關(guān)鍵參數(shù) ?page_number
?。這個(gè)案例里的外部參數(shù)是一個(gè)非捕捉參數(shù) (?:...) 。
?blog_articles
?視圖需要反轉(zhuǎn)最外層捕捉的參數(shù),?page-2/
? 在這里不需要參數(shù),而 ?comments
可以在沒有參數(shù)或 ?page_number
值的情況下反轉(zhuǎn)。
嵌套捕捉參數(shù)在視圖參數(shù)和 URL 直接創(chuàng)建一個(gè)強(qiáng)耦合,如 ?blog_articles
所示:視圖接收部分 URL (?page-2/
?) 而不只是視圖要的值。當(dāng)反轉(zhuǎn)時(shí)這種耦合更明顯,因?yàn)榉崔D(zhuǎn)視圖我們需要傳遞一段 URL 而不是 ?page number
?。
根據(jù)經(jīng)驗(yàn),只有當(dāng)正則表達(dá)式需要一個(gè)參數(shù)但視圖忽略它時(shí),才捕捉該視圖需要的值并使用非捕捉參數(shù)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: