新聞中心
在 Django 項(xiàng)目中,一個(gè)常見(jiàn)需求是獲取最終形式的 URL,比如用于嵌入生成的內(nèi)容中(視圖和資源網(wǎng)址,給用戶展示網(wǎng)址等)或用戶服務(wù)器端的導(dǎo)航處理(重定向等)。

強(qiáng)烈建議不要硬編碼 URL(這是一個(gè)費(fèi)力、不能擴(kuò)展、容易出錯(cuò)的主意)。同樣危險(xiǎn)的是設(shè)計(jì)臨時(shí)機(jī)制來(lái)生成的 URL 與URLconf描述的設(shè)計(jì)的URL一樣,這會(huì)導(dǎo)致 URL 隨著時(shí)間的推移變得過(guò)時(shí)。
換句話說(shuō),需要的是 DRY 機(jī)制。除其他優(yōu)勢(shì)外,它還允許 URL 設(shè)計(jì)自動(dòng)更新,而不必遍歷所有項(xiàng)目代碼來(lái)搜索和替換過(guò)時(shí)的 URL 。
我們用來(lái)獲取 URL 的首要信息是負(fù)責(zé)處理它的視圖的標(biāo)識(shí)(例如名稱)。必須參與查找正確網(wǎng)址的其他信息是視圖參數(shù)的類型(位置、關(guān)鍵字)和值。
Django 提供了一個(gè)解決方案,使得 URL 映射是 URL 設(shè)計(jì)唯一的倉(cāng)庫(kù)。你使用 URLconf 來(lái)填充它,然后可以雙向使用它:
- 從用戶/瀏覽器請(qǐng)求的 URL 開始,它調(diào)用正確的Django視圖,并從 URL 中提取它的參數(shù)需要的值。
- 從相應(yīng)的 Django 視圖標(biāo)識(shí)以及要傳遞給它的參數(shù)來(lái)獲取相關(guān)聯(lián)的 URL 。
Django 提供執(zhí)行反轉(zhuǎn) URL 的工具,這些工具與需要 URL 的不同層匹配:
- 在模板里:使用 url 模板標(biāo)簽。
- 在 Python 編碼:使用 ?
reverse()? 函數(shù)。 - 在與 Django 模型實(shí)例的 URL 處理相關(guān)的高級(jí)代碼中: ?
get_absolute_url()? 方法。
例如:
from django.urls import path
from . import views
urlpatterns = [
#...
path('articles//', views.year_archive, name='news-year-archive'),
#...
]
根據(jù)這個(gè)設(shè)計(jì),與 ?year nnnn? 相對(duì)應(yīng)的 URL 是 ?/articles/? 。
你可以使用以下方式在模板代碼中來(lái)獲取它們:
2012 Archive
{# Or with the year in a template context variable: #}
{% for yearvar in year_list %}
- {{ yearvar }} Archive
{% endfor %}
或在Python代碼中:
from django.http import HttpResponseRedirect
from django.urls import reverse
def redirect_to_year(request):
# ...
year = 2006
# ...
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
因?yàn)槟承┰?,如果決定改變每年已發(fā)布的文章存檔內(nèi)容的 URL ,你只需要改變 URLconf 中的條目即可。
在一些視圖具有一般性質(zhì)的場(chǎng)景下,URLs 和視圖存在多對(duì)一關(guān)系。對(duì)于這些情況,當(dāng)反轉(zhuǎn) URLs 時(shí),視圖名并不是一個(gè)足夠好的標(biāo)識(shí)符。閱讀下一節(jié)來(lái)了解 Django 如何解決這一問(wèn)題。
本文標(biāo)題:創(chuàng)新互聯(lián)Django4.0教程:Django4.0URL調(diào)度器-URL的反向解析
本文網(wǎng)址:http://www.fisionsoft.com.cn/article/cdpcche.html


咨詢
建站咨詢
