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

在templates/home.html:

<!DOCTYPE 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
页面显示这里写图片描述
使用正则表达式里的群组时,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')
 
  • 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://localhosthttp://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
浏览器会报错:
这里写图片描述
原因是参数重复赋值了
上述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
这里写图片描述

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

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传来两次值,于是报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lm_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值