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:
<html>
<head> <title> Welcome title> head>
<body>
<p> hellow world! p>
body>
html>
在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\d+)&(?P\d+)$' , 'app-name.views.home')
此时可匹配的url为:
http://localhost:8000/1555&16666
其余与上述情况一致
需要注意:正则表达式里的群组个数应该与视图函数的除了request参数外的其他参数个数相匹配,否则会报错
另外,使用群组来设置参数,理论上可以设置多个参数,但是这种方法很容易出现匹配混乱,在参数较多时,不是最佳的方法
先来看看查询字符串是什么
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://localhost 或http://localhost/a=5 这样都是合法的, 但不一定不会报错.首先,参数缺省的话,会给相应的参数赋予缺省的默认值,一般就是None其次,如果像上述的views.py里面的home, 使用缺省的查询字符串,回报错,原因是home里面,使用了int()函数,这个函数不能接受None类型的参数
形如
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})
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})
注意:如果这么写,又会报错
url(r'^b=(\d)$', 'app-name.views.home', {'a':5})
输入: http://localhost/b=3
报错:参数a重复赋值
是不是很奇怪:在正则表达式里,不是给a赋值呀,是’b=(\d)’
原因:注意,b=不是说第一个群组的变量名为b, 只是让url更容易理解而已, 前面说过,群组是按顺序给视图函数传入参数的,所以,不管第一个群组的变量名为什么,都是传给视图函数除了reuqest外的第一个参数,所以,上面实际是给参数a传来两次值,于是报错