根目錄/urls.py


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)

效果圖:


image.png

image.png

改成\w即可匹配所有大小寫字母還有阿拉伯數字了:
image.png

2.url函數中的name有什么用:

簡單說,name 可以用于在 templates, models, views ……中得到對應的網址,相當于“給網址取了個名字”,只要這個名字不變,網址變了也能通過名字獲取到。

實際需求:
image.png

我們計算加法的時候用的是 /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/ 了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。