HTML表单是网站交互性的经典方式。 本章将介绍如何用Django对用户提交的表单数据进行处理。
HTTP 请求
HTTP协议以"请求-回复"的方式工作。客户发送请求时,可以在请求中附加数据。服务器通过解析请求,就可以获得客户传来的数据,并根据URL来提供特定的服务。
1. GET 方法
1. 在demo2下面新建search.py文件,用于接收用户的请求:
2. 在search.py文件(用于接收用户的请求)中输入:
from django.http import HttpResponse
from django.shortcuts import render
# 表单
def search_form(request):
return render(request,"search_form.html")
# 接收请求数据
def search(request):
request.encoding="uft-8"
if "q" in request.GET and request.GET["q"]: #GET结果里面有没有q这个参数,也就是有没有输入框,并且q这个参数里面不是空的
message="你搜索的内容为:"+request.GET["q"]
else:
message="你提交的是空表单"
return HttpResponse(message)
3. 在templates 中新建search_form.html 表单
4. 在search.html中输入如下代码:主要是新增了form /form这一段
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/search/" method="get"> #表单的响应是一个地址search
<input type="text" name="q">
<input type="submit" value="搜索一下">
</form>
</body>
</html>
5. urls.py 规则修改为如下形式:
from django.urls import include, re_path # 因为django4.0以上版本的版本
from . import views,testdb,search
urlpatterns = [
re_path(r'^search_form/$',search.search_form),
re_path(r"^search/$",search.search),
]
6. 我们开始测试程序:在地址栏中输入 http://127.0.0.1:8002/search_form/
出现如下
7. 此时在搜索栏中输入 测试001,然后点击搜索一下
8. 网页跳转到httpresponse,响应了一句话
9. 当我们在输入栏中什么都不输入的时候,网页显示如下,说明程序成功!
10. 接下来,我们来介绍一下程序到底是如何运行的:
首先在路由地址中访问search_form, 地址映射到search.py中的search_form函数,该请求响应的是search_form.html
然后我们在search_form.html,body中有一串表单代码,意思是有个输入框,有个提交submit按钮,然后该表单响应了一个新的地址search,方法是get,就是把参数的值获取到,这里指的是"q"这个参数的值获得到
然后在urls中找到了路径search, 该地址映射到了search.py中的search函数,该请求响应了一个HttpResponse对象,返回了一个带message信息的页面,message就是我们希望显示的内容
2. POST 方法
上面我们使用了GET方法。视图显示和请求处理分成两个函数处理。我们视图显示用了一个路由search_form,映射了一个search_form函数,用来显示了一个网页,但是当网页请求处理时,也就是action时,又用了另外一个路由和与之映射名叫search的函数。
但是提交数据时更常用POST方法,并用一个URL和处理函数,同时显示视图和处理请求,也就是在同一个页面显示。我们下面使用该方法,
1. 首先在urls.py中修改,增加一个路由search-post
from django.urls import include, re_path # 因为django4.0以上版本的版本
from . import views,testdb,search,search2
urlpatterns = [
re_path(r'^search_form/$',search.search_form),
re_path(r"^search/$",search.search),
re_path(r'^search-post/$', search2.search_post),
]
2. 在demo2中新建一个search2.py文件
3. 在search2.py中输入代码:并新建 search_post 函数来处理 POST 请求
from django.shortcuts import render
from django.views.decorators import csrf
# 接收POST请求数据
def search_post(request):
ctx ={}
if request.POST:
ctx['result'] = request.POST['q']
return render(request, "post.html", ctx)
4. 在templates中新建一个post.html
5.在 post.html输入如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/search-post/" method="post">
{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="搜索">
</form>
<p>{{ result }}</p>
</body>
</html>
在模板的末尾,我们增加一个 result 标签。
表格后面还有一个 {% csrf_token %} 的标签。csrf 全称是 Cross Site Request Forgery。这是 Django 提供的防止伪装提交请求的功能。POST 方法提交的表格,必须有此标签。
6. 最后我们输入如下地址:http://127.0.0.1:8002/search-post/
7. 简单测试一下,输入测试004 ( 之前测试003显示在底下了)
8. 点击搜索:
9. 接下来,我们来介绍一下程序到底是如何运行的:
首先在路由地址中访问search-post, 地址映射到search2.py中的search_post函数,该请求响应的是post.html,因为此时request.POST不成立,因此只是ctx这个字典中也没有传入POST的值
然后我们在post.html,body中有一串表单代码,意思是有个输入框,有个提交submit按钮,然后该表单一旦被动作,就会激活访问search-post 地址,方法是post.
然后在urls中重新访问search-post 地址, 重新映射search2.py中的search_post函数,此时request.POST为true, 将POST中参数为"q"的值取出来赋值给字典ctx中的键(这个键名叫result)。此时该请求响应了一个render对象,重新返回了一个post.html页面,并传入ctx字典,字典中的键result被html中要求显示出来,因此最终显示了”q“中上一轮输入的值