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')
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

在templates/home.html:


<html>
    <head> <title> Welcome title> head>
    <body>
       <p> hellow world! p>
    body>
html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.最简单地参数,使用正则表达式的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
页面显示django中的url函数_第1张图片
使用正则表达式里的群组时,url()会自动将群组作为参数按顺序传入视图函数中,所以上述实现过程如此:
param1 = 8, param2 = 3
home(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
  • 1

views.py

def 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
  • 1

4使用群组和关键字参数一起用

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

输入http://localhost:8000/a=6&b=7
浏览器会报错:
django中的url函数_第2张图片
原因是参数重复赋值了
上述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})
  • 1
  • 1

输入:http://localhost:8000/a=5
django中的url函数_第3张图片

注意:如果这么写,又会报错

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

输入: http://localhost/b=3
报错:参数a重复赋值
django中的url函数_第4张图片
是不是很奇怪:在正则表达式里,不是给a赋值呀,是’b=(\d)’
原因:注意,b=不是说第一个群组的变量名为b, 只是让url更容易理解而已, 前面说过,群组是按顺序给视图函数传入参数的,所以,不管第一个群组的变量名为什么,都是传给视图函数除了reuqest外的第一个参数,所以,上面实际是给参数a传来两次值,于是报错

你可能感兴趣的:(linux,python)