1. 打開 zqxt_views/urls.pycss
1
2
3
4
5
6
7
8
9
10
|
from
django.conf.urls
import
url
from
django.contrib
import
admin
from
calc
import
views as calc_views
urlpatterns
=
[
url(r
'^add/$'
, calc_views.add, name
=
'add'
),
url(r
'^add/(\d+)/(\d+)/$'
, calc_views.add2, name
=
'add2'
),
url(r
'^admin/'
, admin.site.urls),
]
|
url(r'^add/$', calc_views.add, name='add'), 這裏的 name='add' 是用來幹什麼的呢?html
簡單說,name 能夠用於在 templates, models, views ……中獲得對應的網址,至關於「給網址取了個名字」,只要這個名字不變,網址變了也能經過名字獲取到。python
爲了進一步弄清這個問題,咱們先建一個首頁的視圖和url正則表達式
2. 修改 calc/views.pyshell
1
2
3
4
5
6
7
8
9
|
from
django.http
import
HttpResponse
from
django.shortcuts
import
render
def
index(request):
return
render(request,
'home.html'
)
...此處省去一些代碼
|
render 是渲染模板,不懂先照着打就好。django
3. 將 'calc' 這個 app 加入到 zqxt_views/settings.py 中bash
1
2
3
4
5
6
7
8
9
10
|
INSTALLED_APPS
=
[
'django.contrib.admin'
,
'django.contrib.auth'
,
'django.contrib.contenttypes'
,
'django.contrib.sessions'
,
'django.contrib.messages'
,
'django.contrib.staticfiles'
,
'calc'
,
]
|
這樣,使用render的時候,Django 會自動找到 INSTALLED_APPS 中列出的各個 app 下的 templates 中的文件。服務器
小提示,DEBUG=True 的時候,Django 還能夠自動找到 各 app 下 static 文件夾中的靜態文件(js,css,圖片等資源),方便開發,後面有專門的章節會講這些。session
4. 咱們在 calc 這個 app 中新建一個 templates 文件夾,在templates中新建一個 home.html (關於模板更詳細的能夠稍後看下一節)app
文件 calc/templates/home.html 中寫入如下內容(保存時用 utf8 編碼)
1
2
3
4
5
6
7
8
9
10
11
|
<!DOCTYPE html>
<
html
>
<
head
>
<
title
>自強學堂</
title
>
</
head
>
<
body
>
<
a
href
=
"/add/4/5/"
>計算 4+5</
a
>
</
body
>
</
html
>
|
修改 zqxt_views/urls.py
1
2
3
4
5
6
7
8
|
...此處省去一些代碼
urlpatterns
=
[
url(r
'^$'
, calc_views.index, name
=
'home'
),
url(r
'^add/$'
, calc_views.add, name
=
'add'
),
url(r
'^add/(\d+)/(\d+)/$'
, calc_views.add2, name
=
'add2'
),
url(r
'^admin/'
, admin.site.urls),
]
|
運行開發服務器,咱們訪問 http://127.0.0.1:8000/ 能夠看到
咱們計算加法的時候用的是 /add/4/5/ ,後來需求發生變化,好比改爲 /4_add_5/,但在網頁中,代碼中不少地方都寫死的 /add/4/5/,好比模板中多是這麼寫的
1
|
<
a
href
=
"/add/4/5/"
>計算 4+5</
a
>
|
若是這樣寫「死網址」,會使得在改了網址(正則)後,模板(template),視圖(views.py,好比用於URL跳轉),模型(models.py,獲取記錄訪問地址等)用了此網址的,都必須進行相應的更改,修改的代價很大,一不當心,有的地方沒改過來,就不能用了。
那麼有沒有更優雅的方式來解決這個問題呢?固然答案是確定的。
咱們先說一下如何用 Python 代碼獲取對應的網址(能夠用在 views.py,models.py等各類須要轉換獲得網址的地方):
咱們在終端上輸入(推薦安裝 bpython, 這樣Django會用 bpython的 shell)
1
|
python manage.py shell
|
1
2
3
4
5
6
7
8
|
>>>
from
django.core.urlresolvers
import
reverse
# django 1.4.x - django 1.10.x
或者
>>>
from
django.urls
import
reverse
# Django 1.10.x - Django 2.x 新的,更加規範了
>>> reverse(
'add2'
, args
=
(
4
,
5
))
u
'/add/4/5/'
>>> reverse(
'add2'
, args
=
(
444
,
555
))
u
'/add/444/555/'
|
reverse 接收 url 中的 name 做爲第一個參數,咱們在代碼中就能夠經過 reverse() 來獲取對應的網址(這個網址能夠用來跳轉,也能夠用來計算相關頁面的地址),只要對應的 url 的name不改,就不用改代碼中的網址。
在網頁模板中也是同樣,能夠很方便的使用。
1
2
3
4
5
6
7
|
不帶參數的:
{% url 'name' %}
帶參數的:參數能夠是變量名
{% url 'name' 參數 %}
例如:
<
a
href
=
"{% url 'add2' 4 5 %}"
>link</
a
>
|
上面的代碼渲染成最終的頁面是
1
|
<
a
href
=
"/add/4/5/"
>link</
a
>
|
這樣就能夠經過 {% url 'add2' 4 5 %} 獲取到對應的網址 /add/4/5/
當 urls.py 進行更改,前提是不改 name(這個參數設定好後不要輕易改),獲取的網址也會動態地跟着變,好比改爲:
1
|
url(r
'^new_add/(\d+)/(\d+)/$'
, calc_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 寫一個跳轉的函數:
1
2
3
4
5
6
7
8
9
|
from
django.http
import
HttpResponseRedirect
from
django.core.urlresolvers
import
reverse
# Django 1.4.x - Django 1.10.x
# from django.urls import reverse # Django 1.10.x - Django 2.x
def
old_add2_redirect(request, a, b):
return
HttpResponseRedirect(
reverse(
'add2'
, args
=
(a, b))
)
|
urls.py中:
1
2
|
url(r
'^add/(\d+)/(\d+)/$'
, calc_views.old_add2_redirect),
url(r
'^new_add/(\d+)/(\d+)/$'
, calc_views.add2, name
=
'add2'
),
|
這樣,假如用戶收藏夾中有 /add/4/5/ ,訪問時就會自動跳轉到新的 /new_add/4/5/ 了