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中的'new_add/<int:a>/<int:b>'就是網址)。

爲了進一步弄清這個問題,我們先建一個首頁的視圖和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'),

如下圖所示:

 

運行代碼,訪問 http://127.0.0.1:8000/即可看到:

 

留意一下上方的網址:

 

 

然後我們接着往後看。

我們計算加法的時候用的是 /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>標籤所鏈接的網址爲:

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章