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
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
<!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/ 了