Django URL name詳解
開場白不多說,下面直接開始。先上一下完成的工程目錄(注:使用的編譯器為Pycharm,python版本為3.6,django版本為2.0)
1.先開啟django目錄下的urls.py檔案,檔案程式碼如下:
我們看到url列表中有
path('add/<int:a>/<int:b>', learn_views.add, name='add2')
那麼這個path中的name=’add2’到底是做什麼的呢?
如果學習app或者前端開發就會知道,這個name類似於id的作用,name 可以用於在 templates, models, views ……中得到對應的網址,相當於“給網址取了個名字”,其作為唯一識別符號,可以通過name來獲得網址。只要這個名字不變,網址變了也能通過名字獲取到。(注:path中的
為了進一步弄清這個問題,我們先建一個首頁的檢視和url。
2.修改learn目錄下的view.py
加入上圖函式,render是渲染模板,這裡不做太多解釋。上圖中learn我已經提前宣告到djangotest的settings.py檔案中,若未宣告的話加入即可。
3. 我們在 learn 這個 app 中新建一個 templates 資料夾,在templates中新建一個 home.html,在裡面寫入以下內容:
再轉到djangotest中的url.py檔案中,新增一個path
path('', learn_views.index, name='home'),
如下圖所示:
留意一下上方的網址:
然後我們接著往後看。
我們計算加法的時候用的是 /add/4/5/ ,後來需求發生變化,比如改成 /4_add_5/,但在網頁中,程式碼中很多地方都寫死的 /add/4/5/,比如模板中可能是這麼寫的
<a href="/add/4/5/">計算 4+5</a>
如果這樣寫“死網址”,會使得在改了網址(正則)後,模板(template),檢視(views.py,比如用於URL跳轉),模型(models.py,獲取記錄訪問地址等)用了此網址的,都必須進行相應的更改,修改的代價很大,一不小心,有的地方沒改過來,就不能用了
那麼有沒有更優雅的方式來解決這個問題呢?這個時候前面提到的name就派上用場了。
我們前面曾提到過,name相當於識別符號的作用,如果我們在呼叫網址時時候name,那麼在修改網址(正則)時,只需要對
path('add/<int:a>/<int:b>', learn_views.add, name='add2')
中的'add/<int:a>/<int:b>' 進行修改。
我們將path中的'add/<int:a>/<int:b>' 更改為'new_add/<int:a>/<int:b>'
但是我們不對name=’add2’進行修改。然後在views.py 或 models.py 等地方的 reverse函式,同樣會根據 name 對應的url獲取到新的網址。
想要改網址的時候,修改 urls.py 中的正則表示式部分(url 引數第一部分),name 不變的前提下,其它地方都不需要修改。
另外,比如使用者收藏夾中收藏的URL是舊的,如何讓以前的 /add/3/4/自動跳轉到現在新的網址呢?
這時候我們就需要自己寫一個跳轉方法。轉到learn.view.py的檔案中。
寫出如下方法。
再回到url.py中,修改以下部分:
這時候我們再來執行程式。
此時網址變為了new_add/5/4,與前面的add/5/4不同。我再reverse中通過path的name來呼叫,此時我們就不用再去修改home.html檔案中的<a>標籤所連結的網頁。若是我沒有通過name來進行呼叫的話,會怎麼樣呢?請接著往下看。
先進入urls.py檔案,修改其中的程式碼,將name屬性刪除。
注意:此時我們html檔案中的<a>標籤所連結的網址為: