django的url函数

来源:互联网 发布:钣金展开软件 编辑:程序博客网 时间:2024/06/05 15:58
django 的url()函数使用url()函数用于将视图函数和url关联起来, 下面总结学习过程中对url()与视图函数的参数对应问题在建立的app-name文件的views.py中,初始内容如下:from django.shortcuts import renderfrom django.http import HttpResponsedef home(request): return render(request, 'home.html') 1 2 3 4 1 2 3 4在templates/home.html:

hellow world!

1 2 3 4 5 6 7 1 2 3 4 5 6 71.最简单地参数,使用正则表达式的named group作为参数在urls.py中修改urls()url(r'a=(\d+)&b=(\d+)', 'app-name.views.home') 1 1修改views.py:def home(request, a, b): return HttpResponse(str(int(a) + int(b))) 1 2 1 2在浏览器中输入http://localhost:8000/a=8&b=5页面显示这里写图片描述使用正则表达式里的群组时,url()会自动将群组作为参数按顺序传入视图函数中,所以上述实现过程如此:param1 = 8, param2 = 3home(request, param1, param2)还可以给group 命名, 即为 named group:url(r'^(?P\d+)&(?P\d+)$', 'app-name.views.home') 1 1此时可匹配的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))) 1 2 3 4 1 2 3 4在浏览器输入http://localhost:8000/?a=5&b=3即可显示同样的内容注意:如果在浏览器里面输入http://localhost 或http://localhost/a=5 这样都是合法的, 但不一定不会报错.首先,参数缺省的话,会给相应的参数赋予缺省的默认值,一般就是None其次,如果像上述的views.py里面的home, 使用缺省的查询字符串,回报错,原因是home里面,使用了int()函数,这个函数不能接受None类型的参数3.还可以传如额外参数,以关键字参数形式形如urls.py:url(r'^$', 'app-name.views.home', {'a':5, 'b':3}) 1 1views.pydef home(request, a, b): return HttpResponse(str(int(a) + int(b))) 1 2 1 2注意:在url()中传入的dict的key应该与home的定义的参数一样一下是错误的写法:url(r'^$', 'app-name.views.home', {'c':5, 'b':3}) 1 14使用群组和关键字参数一起用url(r'^a=(\d)$b=(\d)', 'app-name.views.home', {'a':5, 'b':3}) 1 1输入http://localhost:8000/a=6&b=7浏览器会报错:这里写图片描述原因是参数重复赋值了上述url下, 实现过程如下:param1 = 6, param2 = 7a = 5, b = 3home(request, param1, param2) 还是 home(request, a, b)浏览器解释器无法判断,所以会报错使用群组和关键字参数混搭时,要注意不要重复赋值下面写法都是正确的:url(r'a=(\d)'. 'app-name.views.home', {'b':3}) 1 1输入:http://localhost:8000/a=5这里写图片描述注意:如果这么写,又会报错url(r'^b=(\d)$', 'app-name.views.home', {'a':5}) 1 1输入: http://localhost/b=3报错:参数a重复赋值这里写图片描述是不是很奇怪:在正则表达式里,不是给a赋值呀,是’b=(\d)’原因:注意,b=不是说第一个群组的变量名为b, 只是让url更容易理解而已, 前面说过,群组是按顺序给视图函数传入参数的,所以,不管第一个群组的变量名为什么,都是传给视图函数除了reuqest外的第一个参数,所以,上面实际是给参数a传来两次值,于是报错
原创粉丝点击