Django入门(十三)表单

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“中上一轮输入的值

总结:可以看到,POST方法更加适合http对用户提交的表单数据进行处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DOT Manager

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

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

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

打赏作者

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

抵扣说明:

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

余额充值