Django url的反向解析
阿新 • • 發佈:2019-01-27
在建立Django專案時,一個常見的需求時如何獲得URL的最終形式以嵌入到所生成的Content中(即嵌入到檢視中、或URL資源中,或者顯示給使用者的URL等)或著用於處理伺服器端的導航流(如:重定向等)。但是,人們強烈希望不要硬編碼這些URL或者設計一種與URLconf毫不相干的專門URL生成機制,因為這樣容易導致一定程度上產生過期的URL。
Django提供了一個解決方案使得URL對映時URL設計唯一的儲存庫。你用你的URLconf填充它,然後可以雙取向使用它。
● 根據使用者/瀏覽器發起的URL請求,它呼叫正確的Django檢視,並從URL中提取它的引數需要的值。
● 根據Django檢視中的標識和將要傳遞給它的引數的值,獲取與之關聯的URL。
其中,第二種方式叫做反向解析URL、方向URL匹配、反向URL查詢或者簡單的URL反查。在需要URL的地方,對於不同層級,Django提供不同的工具用於URL反查:
● 在模版中:使用url模版標籤
● 在Python程式碼中:使用django.core.urlresolvers.reverse()函式
● 在更高層次的雨處理Django模型是例相關程式碼中:使用get_absolute_url()方法
舉個例子:
下面的URLconf:
from django.conf.urls import url
from . import views
urlpatterns = [
#...
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
#...
]
根據設計,某一年nnnn對應的歸檔的URL是/articles/nnnn/。
在模版的程式碼中使用下面的方法獲取它們:
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a >
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>
在Python程式碼中,這樣使用:
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
def redirect_to_year (request):
# ...
year = 2006
# ...
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))