1.怎么從url中獲取用戶輸入的參數?
urls.py
# ex: http://example.com/5/
url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
# ex: http://example.com/5/results/
url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
將匹配到的(?P<question_id>[0-9]+)最短數字串作為question_id傳入views.detail函數。
PS: P應該是parameter的縮寫
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
效果圖:
改成\w即可匹配所有大小寫字母還有阿拉伯數字了:
2.url函數中的name有什么用:
簡單說,name 可以用于在 templates, models, views ……中得到對應的網址,相當于“給網址取了個名字”,只要這個名字不變,網址變了也能通過名字獲取到。
實際需求:
我們計算加法的時候用的是 /add/4/5/ ,后來需求發生變化,比如改成 /4_add_5/,但在網頁中,代碼中很多地方都寫死的 /add/4/5/,比如模板中可能是這么寫的
<a href="/add/4/5/">計算 4+5</a>
如果這樣寫“死網址”,會使得在改了網址(正則)后,模板(template),視圖(views.py,用以用于跳轉),模型(models.py,可以用用于獲取對象對應的地址)用了此網址的,都得進行相應的更改,修改的代價很大,一不小心,有的地方沒改過來,就不能用了。
在網頁模板中也是一樣,可以很方便的使用。
不帶參數的:
{% url 'name' %}
帶參數的:參數可以是變量名
{% url 'name' 參數 %}
例如:
<a href="{% url 'add2' 4 5 %}">link</a>
上面的代碼渲染成最終的頁面是
<a href="/add/4/5/">link</a>
當 urls.py 進行更改,前提是不改 name(這個參數設定好后不要輕易改),獲取的網址也會動態地跟著變,比如改成:
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
add 變成了 new_add,但是后面的 name='add2' 沒改,這時 {% url 'add2' 4 5 %} 就會渲染對應的網址成 /new_add/4/5/而不是老的add/4/5。
用在 views.py 或 models.py 等地方的 reverse函數,同樣會根據 name 對應的url獲取到新的網址。
-
但這只是改了服務端的超鏈接,用戶端收藏的鏈接還是需要302跳轉的啊 !
需要使用reverse函數進行轉換:
>>> from django.core.urlresolvers import reverse # django 1.4.x - django 1.10.x
>>> from django.urls import reverse # django 1.10.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不改,就不用改代碼中的網址。
- 具體思路是,在 views.py 寫一個跳轉的函數:
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse # django 1.4.x - django 1.10.x
def old_add2_redirect(request, a, b):
return HttpResponseRedirect(
reverse('add2', args=(a, b))
)
urls.py中:
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/ 了