06 Django URL name詳解

一、打開urls.py

from django.conf.urls import url
from django.contrib import admin
from Django_App import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/',views.index),
    url(r'^$',views.index),
    url(r'^login',views.login),
    url(r'^add/$',views.add,name='add'),
    url(r'^add/(\d+)/(\d+)/$', views.add2, name='add2'),
]
url(r'^add/$',views.add,name='add')這裏的 name='add' 是用來幹什麼的呢?
簡單說,name 能夠用於在 templates, models, views ……中獲得對應的網址,至關於「給網址取了個名字」,只要這個名字不變,網址變了也能經過名字獲取到。

爲了進一步弄清這個問題,咱們先建一個首頁的視圖和urlcss

二、修改views.py文件

from django.http import HttpResponse
from django.shortcuts import render
 
def index(request):
    return render(request, 'home.html')

render 是渲染模板html

使用render的時候,Django 會自動找到 INSTALLED_APPS 中列出的各個 app 下的 templates 中的文件。正則表達式

小提示,DEBUG=True 的時候,Django 還能夠自動找到 各 app 下 static 文件夾中的靜態文件(js,css,圖片等資源),方便開發django

 

三、在APP的templates中新建一個 home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/add/4/5">計算4+5</a>
</body>
</html>

修改urls.py服務器

from django.conf.urls import url
from django.contrib import admin
from Django_App import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/',views.index),
    url(r'^$',views.index,name='home'),#修改部分
    url(r'^login',views.login),
    url(r'^add/$',views.add,name='add'),
    url(r'^add/(\d+)/(\d+)/$', views.add2, name='add2'),
]

運行開發服務器,咱們訪問 http://127.0.0.1:8000/ 能夠看到。app

咱們計算加法的時候用的是 /add/4/5/ ,後來需求發生變化,好比改爲 /4_add_5/,但在網頁中,代碼中不少地方都寫死的 /add/4/5/,好比模板中多是這麼寫的 函數

<a href="/add/4/5/">計算 4+5</a>

若是這樣寫「死網址」,會使得在改了網址(正則)後,模板(template),視圖(views.py,用以用於跳轉),模型(models.py,能夠用用於獲取對象對應的地址)用了此網址的,都得進行相應的更改,修改的代價很大,一不當心,有的地方沒改過來,就不能用了。url

那有什麼解決辦法呢?spa

咱們先說一下如何用 Python 代碼獲取對應的網址(能夠用在 views.py,models.py等各類須要轉換獲得網址的地方):code

from django.urls import reverse
reverse('add2', args=(4,5))
Out[3]: 
'/add/4/5/'
reverse('add2', args=(444,555))
Out[4]: 
'/add/444/555/'

reverse 接收 url 中的 name 做爲第一個參數,咱們在代碼中就能夠經過 reverse() 來獲取對應的網址(這個網址能夠用來跳轉,也能夠用來計算相關頁面的地址),只要對應的 url 的name不改,就不用改代碼中的網址。

在網頁模板中也是同樣,能夠很方便的使用。

不帶參數的:
{% url 'name' %}
帶參數的:參數能夠是變量名
{% url 'name' 參數 %}
 
例如:
<a href="{% url 'add2' 4 5 %}">link</a>

上面的代碼渲染成最終的頁面是

<a href="/add/4/5/">link</a>

這樣就能夠經過 {% url 'add2' 4 5 %} 獲取到對應的網址 /add/4/5/

當 urls.py 進行更改,前提是不改 name(這個參數設定好後不要輕易改),獲取的網址也會動態地跟着變,好比改爲:

url(r'^new_add/(\d+)/(\d+)/$', views.add2, name='add2'),

注意看重點 add 變成了 new_add,可是後面的 name='add2' 沒改,這時 {% url 'add2' 4 5 %} 就會渲染對應的網址成 /new_add/4/5/

用在 views.py 或 models.py 等地方的 reverse函數,一樣會根據 name 對應的url獲取到新的網址。

想要改網址的時候,修改 urls.py 中的正則表達式部分(url 參數第一部分),name 不變的前提下,其它地方都不須要修改。

另外,好比用戶收藏夾中收藏的URL是舊的,如何讓之前的 /add/3/4/自動跳轉到如今新的網址呢?

要知道Django不會幫你作這個,這個須要本身來寫一個跳轉方法

具體思路是,在 views.py 寫一個跳轉的函數:

from django.http import HttpResponseRedirect
from django.urls import reverse
def old_add2_redirect(request, a, b):
    return HttpResponseRedirect(
        reverse('add2', args=(a, b))

在urls.py中添加以下兩條記錄:

url(r'^add/(\d+)/(\d+)/$', views.old_add2_redirect),
url(r'^new_add/(\d+)/(\d+)/$',views.add2, name='add2'),

這樣,假如用戶收藏夾中有 /add/4/5/ ,訪問時就會自動跳轉到新的 /new_add/4/5/ 了

相關文章
相關標籤/搜索