1. 程式人生 > >Django url的反向解析

Django url的反向解析

在建立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,)))