在使用Django 項目時,一個常見的需求是得到URL 的最終形式,以用於嵌入到生成的內容中(視圖中和顯示給用戶的URL等)或者用於處理服務器端的導航(重定向等)。人們強烈但願不要硬編碼這些URL(費力、不可擴展且容易產生錯誤)或者設計一種與URLconf 絕不相關的專門的URL 生成機制,由於這樣容易致使必定程度上產生過時的URL。html
換句話講,須要的是一個DRY 機制。除了其它有點,它還容許設計的URL 能夠自動更新而不用遍歷項目的源代碼來搜索並替換過時的URL。django
獲取一個URL 最開始想到的信息是處理它視圖的標識(例如名字),查找正確的URL 的其它必要的信息有視圖參數的類型(位置參數、關鍵字參數)和值。瀏覽器
Django 提供一個辦法是讓URL 映射是URL 設計惟一的地方。你填充你的URLconf,而後能夠雙向使用它:服務器
第一種方式是咱們在前面的章節中一直討論的用法。app
第二種方式叫作反向解析URL、反向URL 匹配、反向URL 查詢或者簡單的URL 反查。函數
在須要URL 的地方,對於不一樣層級,Django 提供不一樣的工具用於URL 反查:工具
django.core.urlresolvers.reverse()
函數。get_absolute_url()
方法。
簡單來講就是能夠給咱們的URL匹配規則起個名字,一個URL匹配模式起一個名字。這樣咱們之後就不須要寫死URL代碼了,只須要經過名字來調用當前的URL:編碼
舉個簡單的例子:url
url(r'^home', views.home, name='home'), # 給個人url匹配模式起名爲 home url(r'^index/(\d*)', views.index, name='index'), # 給個人url匹配模式起名爲index
這樣:spa
在模板裏面能夠這樣引用:
{% url 'home' %}
在views函數中能夠這樣引用:
from django.urls import reverse reverse("index", args=("2018", ))
例子:
考慮下面的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,)))
若是出於某種緣由決定按年歸檔文章發佈的URL應該調整一下,那麼你將只須要修改URLconf 中的內容。
在某些場景中,一個視圖是通用的,因此在URL 和視圖之間存在多對一的關係。對於這些狀況,當反查URL 時,只有視圖的名字還不夠。
例子中:
分析:想咱們一開始寫的硬編碼,也就是吧action要跳轉的路徑寫死了。可是像淘寶,天貓等都會常常更新新東西,,那麼你的頁面上的url路徑也會時不時的變化。可是若是有特別多的商品,那麼你就得去服務端一個一個的改,這樣顯得很麻煩,那麼有沒有一種機制幫咱們解決問題呢?那就按照我下面的辦法解決。就把url路徑寫活了。
一、首先給url起一個別名。
二、而後在login.html中寫上{% url ‘別名’’ %} ,若是在頁面中點擊查看元素,它會變成login.html,,,固然個人是分發了,,就會變成test/login.html
三、這樣你就能夠修改你的正則了,,由於他是按照別名走的,不會影響。
urls.py
login.html
查看元素的結果:
這樣的好處是:不管你怎麼改你要匹配的url,只要你寫上了別名。在html實現了模板語法,就會去找別名對應的那個url,之後無論你怎麼改url都沒事,就寫活了,就不像一開始寫的硬編碼了。
注意:
爲了完成上面例子中的URL 反查,你將須要使用命名的URL 模式。URL 的名稱使用的字符串能夠包含任何你喜歡的字符。不僅限制在合法的Python 名稱。
當命名你的URL 模式時,請確保使用的名稱不會與其它應用中名稱衝突。若是你的URL 模式叫作comment
,而另一個應用中也有一個一樣的名稱,當你在模板中使用這個名稱的時候不能保證將插入哪一個URL。
在URL 名稱中加上一個前綴,好比應用的名稱,將減小衝突的可能。咱們建議使用myapp-comment
而不是comment
。