1、什么是URL的参数
URL
:统一资源定位符,他的形式如下:
schema://host[:port#]/path/.../[?query-string][#anchor]
schema
:指定使用的协议(如:http,https,ftp)host
:Http服务器的IP地址或者域名port
:端口号,http默认是80端口path
:访问资源的路径query-string
:发送给http服务器的数据anchor
:锚点
例如:http://127.0.0.1:8000/hello/
其中URL
中可以通过?
将请求的资源和请求的参数分离开。
例如
http://127.0.0.1:8000/add_item/?title=hello
其中title=hello
就是用户请求/add_item/
资源的参数,URL
的参数的格式:
参数名=参数值
参数值可以为空,若多个参数则以&符号做多参数的连接。
2、HttpRequest对象
- 服务器接收到
http
协议的请求后,会根据报文创建HttpRequest
对象 - 视图函数的第一个参数是
HttpRequest
对象 - 在
django.http
模块中定义了HttpRequest
对象的API
。
属性
下面除非特别说明,属性都是只读的
path
:一个字符串,表示请求的页面的完整路径,不包含域名method
:一个字符串,表示请求使用的HTTP方法,常用值包括:‘GET’、‘POST’encoding
:一个字符串,表示提交的数据的编码方式 如果为None则表示使用浏览器的默认设置,一般为utf-8。这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值GET
:一个类似于字典的对象,包含get请求方式的所有参数POST
:一个类似于字典的对象,包含post请求方式的所有参数FILES
:一个类似于字典的对象,包含所有的上传文件COOKIES
:一个标准的Python字典,包含所有的cookie,键和值都为字符串session
:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用。
QueryDict对象
定义在django.http.QueryDict
request
对象的属性GET
、POST
都是QueryDict
类型的对象
与python
字典不同,QueryDict
类型的对象用来处理同一个键带有多个值的情况
方法get()
:根据键获取值
- 只能获取键的一个值
- 如果一个键同时拥有多个值,获取最后一个值
dict.get('键',default) 或简写为 dict['键']
方法getlist()
:根据键获取值
- 将键的值以列表返回,可以获取一个键的多个值
dict.getlist('键',default)
GET属性
QueryDict
类型的对象- 包含
get
请求方式的所有参数 - 与
url
请求地址中的参数对应,位于?
后面 - 参数的格式是键值对,如
key1=value1
多个参数之间,使用&
连接,如key1=value1&key2=value2
- 键是开发人员定下来的,值是可变的
POST属性
QueryDict
类型的对象- 包含
post
请求方式的所有参数 - 与
form
表单中的控件对应 - 问:表单中哪些控件会被提交?
- 答:控件要有
name
属性,则name
属性的值为键,value
属性的值为值,构成键值对提交。 - 对于
checkbox
控件,name
属性一样为一组,当控件被选中后会被提交,存在一键多值的情况 - 键是开发人员定下来的,值是可变的。
表单传参方式
get
传参是在url后面显示,为显示传参。
https://www.example.com/myapp/?page=3&age=10
post
传参是隐形传参,通过表单提交。
get传参
(1)新建页面
在templates
下新建study
文件夹,在study
下新建getTest1.html
页面。
(2)配置路由
path('getTest1/',views.getTest1),
(3)定义视图
展示链接的页面
def getTest1(request):
return render(request,"study/getTest1.html")
(4)效果如下:
(5)修改页面如下:
一键一值:<a href="/study/getTest2/?a=1&b=2&c=3">test2</a>
一键多值:<a href="/study/getTest3/?a=1&a=2&a=3"> test3</a>
<a href="/study/getTest2/?a=1&b=2&c=3>test2</a>
在study
前有/
,指相对项目的根目录,即单击test2,得到的地址为:http://1270.0.1:8000/study/getTest2/?a=1&b=2&c=3
。
单击test3得到的地址为:
如果把study
前的/
去掉,即<a href="study/getTest2/?a=1&b=2&c=3>test2</a>
,表示相对当前页面的地址。
当前页面的地址为:http://127.0.0.1:8000/study/getTest1/
,拼上相对地址:study/getTest2/?a=1&b=2&c=3
,单击test2得到的地址为:http://127.0.0.1:8000/study/getTest1/study/getTest2/?a=1&b=2&c=3
。
单击test3得到的地址为:
(6)访问getTest1
,并单击试试看。
(7)配置路由
path('getTest2/', views.getTest2),
path('getTest3/', views.getTest3),
(8)定义视图
(9)定义页面
getTest2.html
<body>
a: {{ aa }}
<hr />
b: {{ bb }}
<hr />
c: {{ cc }}
</body>
getTest3.html
<body>
a:{{ aa }}
</body>
(10)查看效果
单击test2
单击test3