>>> django.VERSION (4, 1, 0, 'final', 0)
PS:基于前几章的进度进行修改
一、概述
- 表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分:
表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。
表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。
注释:CGI为通用网关接口
HTML表单是网站交互性的经典方式
HTTP协议以请求——回复的方式工作,当客户发送请求时,可以在请求中附加数据,服务器通过解析请求,从而获得客户传输的数据,并根据URL来提供特定的服务
二、GET方法
- 继续之前的项目,创建
/HelloWorld/HelloWorld/search.py
文件,用于接收用户的请求:
# -*- coding: utf-8 -*- from django.http import HttpResponse from django.shortcuts import render def search_from(request): return render(request,'search_from.html') #指定表单 def search(request): #接收请求数据 request.encoding = 'utf-8' if 'q' in request.GET and request.GET['q']: #对接收数据进行判断 message = '你搜索的内容为:' + request.GET['q'] else: message = '你提交了空表单' return HttpResponse(message)
- 在模板目录中添加
search_from.html
,路径为/HelloWorld/templates/search_from.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>GET_test</title> </head> <body> <form action="/search/" method="get"> <input type="text" name="q"> <input type="submit" value="搜索"> </form> </body> </html>
- 修改
/HelloWorld/HelloWorld/urls.py
#-*- coding: utf-8 -*- from django.urls import path from . import index_test,testdb,search #导入search.py urlpatterns = [ path('hello/',index_test.Hello), path('testdb/',testdb.testdb), path('search-from/',search.search_from), #增加两个path,指定search.py的两个方法 path('search/',search.search), ]
- 访问
IP:8000/search-from
访问
search-from
资源时会调用search_from
方法,此方法会提交search_from.html
表单,表单使用GET
方式去访问search
资源,然后开始执行search
方法,最终输出你搜索的内容为:Test
- 访问
IP:8000/search
因为没有经过上面提交表单的操作,所以在执行
search
方法时,是没有q
参数的,所以判定false,输出你提交了空表单
三、POST方法
- 上面使用了GET方法,视图显示和请求处理分成了两个函数处理
- 下面来看POST方法,下面方法使用一个URL和一个处理函数,同时显示视图和处理请求,下面创建文件
/HelloWorld/templates/post.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>POST_TEST</title> </head> <body> <form action="/search-post/" method="post"> {% csrf_token %} <input type="text" name="q"> <input type="submit" value="搜索"> </form> <p>{{ rlt }}</p> </body> </html>
模板末尾的rlt记号,用于为表格处理结果预留位置,表格后面还有一个{% csrf_token %}标签
注意:csrf全称 Cross Site Request Forgery ,这是 Django 提供的防止伪装提交请求的功能。POST 方法提交的表格,必须有此标签
新建文件/HelloWorld/HelloWorld/search2.py
# -*- coding: utf-8 -*- from django.shortcuts import render from django.views.decorators import csrf def search_post(request): # 接收POST请求数据 ctx ={} if request.POST: ctx['rlt'] = request.POST['q'] return render(request, "post.html", ctx)
- 修改文件
/HelloWorld/HelloWorld/urls.py
#-*- coding: utf-8 -*- from django.urls import path from . import index_test,testdb,search,search2 urlpatterns = [ path('hello/',index_test.Hello), path('testdb/',testdb.testdb), path('search-from',search.search_from), path('search/',search.search), path('search-post',search2.search_post), ]
- 访问
IP:8000/search-post
访问search-post资源时会调用search_post方法,然后提交post.html表单,表单调用/search-post/并且把输入的文本定义到ctx字典中,并定义键值,最终表单末尾进行调用{{ rlt }},这样的效果就是输入任何文本,会输出任何文本
下面是现在的目录结构
四、Request对象
- 每个视图函数的第一个参数是
HttpRequest
对象,例如:
from django.http import HttpResponse def test(request): return HttpResponse("Hello World!!!")
HttpRequest
对象包含当前请求URL的一些信息:
Request对象也有一些有用的方法
五、QueryDict对象
- 在HttpRequest对象中,GET和POST属性是
django.http.QueryDict
类的实例 QueryDict
类似字典的自定义类,用来处理单键对应多值的情况QueryDict
实现所有标准的词典方法,还有一些特有的方法,例如:
除此之外,QueryDict也有一些方法: