django的url()用法總結

django 的url()函數使用

url()函數用於將視圖函數和url關聯起來, 下面總結學習過程中對url()與視圖函數的參數對應問題

在建立的app-name文件的views.py中,初始內容如下:

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

在templates/home.html:

<!DOCTYPE html>
<html>
    <head> <title> Welcome </title> </head>
    <body>
       <p> hellow world! </p>
    </body>
</html>

1.最簡單地參數,使用正則表達式的named group作爲參數

在urls.py中修改urls()

url(r'a=(\d+)&b=(\d+)', 'app-name.views.home')

修改views.py:

def home(request, a, b):
    return HttpResponse(str(int(a) + int(b)))

在瀏覽器中輸入http://localhost:8000/a=8&b=5
頁面顯示這裏寫圖片描述
使用正則表達式裏的羣組時,url()會自動將羣組作爲參數按順序傳入視圖函數中,所以上述實現過程如此:
param1 = 8, param2 = 3
home(request, param1, param2)

還可以給group 命名, 即爲 named group:

url(r'^(?P<a_name>\d+)&(?P<b_name>\d+)$', 'app-name.views.home')

此時可匹配的url爲:
http://localhost:8000/1555&16666
其餘與上述情況一致
需要注意:正則表達式裏的羣組個數應該與視圖函數的除了request參數外的其他參數個數相匹配,否則會報錯
另外,使用羣組來設置參數,理論上可以設置多個參數,但是這種方法很容易出現匹配混亂,在參數較多時,不是最佳的方法

2.使用querystring(查詢字符串)

先來看看查詢字符串是什麼
http://localhost/?a=3&b=5
跟在 ? 後面的就是查詢字符串
用=表示賦值,用&分隔變量

使用查詢字符串同樣可以作爲參數,不過,不是像使用羣組一樣,將參數傳入到home裏面,而是將查詢字符串的參數和值以dict的形式保存在request.GET裏面, 獲取值value的方式有兩種:
1.request.GET[key]
2.request.GET.get(key) (建議使用第二種)
所以要修改views.py:

def home(request):
    a = request.GET.get('a')
    b = request.GET.get('b')
    return HttpResponse(str(int(a) + int(b)))

在瀏覽器輸入http://localhost:8000/?a=5&b=3
即可顯示同樣的內容

注意:如果在瀏覽器裏面輸入http://localhosthttp://localhost/a=5 這樣都是合法的, 但不一定不會報錯.首先,參數缺省的話,會給相應的參數賦予缺省的默認值,一般就是None其次,如果像上述的views.py裏面的home, 使用缺省的查詢字符串,回報錯,原因是home裏面,使用了int()函數,這個函數不能接受None類型的參數

3.還可以傳如額外參數,以關鍵字參數形式

形如
urls.py:

url(r'^$', 'app-name.views.home', {'a':5, 'b':3})

views.py

def home(request, a, b):
    return HttpResponse(str(int(a) + int(b)))

注意:在url()中傳入的dict的key應該與home的定義的參數一樣
一下是錯誤的寫法:

url(r'^$', 'app-name.views.home', {'c':5, 'b':3})

4使用羣組和關鍵字參數一起用

url(r'^a=(\d)$b=(\d)', 'app-name.views.home', {'a':5, 'b':3})

輸入http://localhost:8000/a=6&b=7
瀏覽器會報錯:
這裏寫圖片描述
原因是參數重複賦值了
上述url下, 實現過程如下:
param1 = 6, param2 = 7
a = 5, b = 3
home(request, param1, param2) 還是 home(request, a, b)
瀏覽器解釋器無法判斷,所以會報錯

使用羣組和關鍵字參數混搭時,要注意不要重複賦值
下面寫法都是正確的:

url(r'a=(\d)'. 'app-name.views.home', {'b':3})

輸入:http://localhost:8000/a=5
這裏寫圖片描述

注意:如果這麼寫,又會報錯

url(r'^b=(\d)$', 'app-name.views.home', {'a':5})

輸入: http://localhost/b=3
報錯:參數a重複賦值
這裏寫圖片描述
是不是很奇怪:在正則表達式裏,不是給a賦值呀,是’b=(\d)’
原因:注意,b=不是說第一個羣組的變量名爲b, 只是讓url更容易理解而已, 前面說過,羣組是按順序給視圖函數傳入參數的,所以,不管第一個羣組的變量名爲什麼,都是傳給視圖函數除了reuqest外的第一個參數,所以,上面實際是給參數a傳來兩次值,於是報錯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章