Django(4)表单

2023-05-16

文章目录

  • 一、概述
  • 二、GET方法
  • 三、POST方法
  • 四、Request对象
  • 五、QueryDict对象

此文章参考菜鸟教程:Django 表单 | 菜鸟教程 (runoob.com)

Django版本:

>>> django.VERSION  
(4, 1, 0, 'final', 0)

PS:基于前几章的进度进行修改

一、概述

  • 表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分:
  1. 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
  2. 表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。
  3. 表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的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的一些信息:
属性描述
path请求页面的全路径,不包括域名,也就是访问资源,例如:“/hello/”
method请求中使用的HTTP方法的字符串表示,全大写表示,例如:
if request.method == ‘GET’:
do_something()
elif request.method == ‘POST’:
do_something_else()
GET包含所有HTTP GET参数的类字典对象
POST包含所有HTTP POST参数的类字典对象
注意:服务器是有可能收到空POST请求的,也就是说,表单from通过POST方式提交时,是可以没有数据的,因此如果要判断是否使用POST方法,应该使用if request.method == "POST"而不是if request.POST
REQUEST该属性是POST和GET属性的集合体,但是有特殊性,先查找POST属性,然后再找GET属性,例如:
如果GET = {"name":"zhangsan"}POST = {"age":"22"},那么REQUEST["name"] = "zhangsan",REQUEST["age"] = "22"
COOKIES包含所有cookies的标准Python字典对象,Keys和values都是字符串
FILES包含所有上传文件的类字典对象,FILES中的每个Key都是<input type="file" name=""/>标签中name属性的值,FILES中的每个value同时也是一个标准的Python字典对象,包含下面三个Keys:
(1)filename:上传文件名,使用Python字符串表示
(2)content-type:上传文件的Content type
(3)content:上传文件的原始内容
注意:只有再请求方式是POST、并且请求页面中的<from>enctype="multipart/form-data"属性时,FILES才拥有数据,否则FILES就是一个空字典
META包含所有可用的HTTPS头部信息的字典,例如:
(1)CONTENT_LENGTH
(2)CONTENT_TYPE
(3)QUERY_STRING:未解析的原始查询字符串
(4)REMOTE_ADDR:客户端IP地址
(5)REMOTE_HOST:客户端主机名
(6)SERVER_NAME: 服务器主机名
(7)SERVER_PORT:服务器端口
META 中这些头加上前缀HTTP_为 Key, 冒号(:)后面的为 Value, 例如:
user这是一个django.contrib.auth.models.User对象,代表当前登录的用户,如果访问用户当前没有登录,user将被初始化为django.contrib.auth.models.AnonymousUser的实例,可以通过user的is_authenticated()方法来辨识用户是否登录
if request.user.is_authenticated():
# Do something for logged-in users.
else:
# Do something for anonymous users.
只有激活Django中的AuthenticationMiddleware时,该属性才可用
session唯一可读写的属性,代表当前会话的字典对象,只有激活Django中的sesion支持时该属性才可用
raw_post_data原始HTTP POST数据,未解析过,高级处理时有用
  • Request对象也有一些有用的方法
方法描述
__getitem__(key)返回GET/POST的键值,先取POST,后取GET,如果键不存在则输出KeyError,可用使用字典语法访问HttpRequest对象,例如:
request["foo"]等同于先request.POST["foo"] 然后再request.GET["foo"]的操作。
has_key()检查request.GET or request.POST中是否包含参数指定的Key
get_full_path()返回包含查询字符串的请求路径,例如:
"/music/bands/the_beatles/?print=true"
is_secure()如果请求是安全的,返回True,也就说明发出的请求是HTTPS的

五、QueryDict对象

  • 在HttpRequest对象中,GET和POST属性是django.http.QueryDict类的实例

  • QueryDict类似字典的自定义类,用来处理单键对应多值的情况

  • QueryDict实现所有标准的词典方法,还有一些特有的方法,例如:

方法描述
__getitem__和标准字典的处理不同的是,如果Key对应多个Value,那么__getitem__()将会返回最后一个value
__setitem__设置参数指定Key的Value列表(一个Python列表)
注意:它只能在一个mutable QueryDict对象上被调用,此对象是通过copy()产生的一个QueryDict对象的拷贝
get()如果Key对应多个Value,那么get()会返回最后一个Value
update()参数可以是QueryDict,也可以是标准字典,但是和标准字典的update()方法不同的是,该方法添加字典items,而不是替换
items()和标准字典的items()方法有一点不同,该方法使用单值逻辑的__getitem__()
values()和标准字典的values()方法有一点不同,该方法使用单值逻辑的__getitem__()
  • 除此之外,QueryDict也有一些方法:
copy()返回对象的拷贝,内部实现是用Python标准库的copy.deepcopy()。该拷贝是mutable(可更改的) 也就是说,可以更改该拷贝的值
getlist(key)返回和参数Key对应的所有值,作为一个Python 列表返回。如果Key不存在,则返回空列表
setlist(key,list_)设置Key的值为list_ (unlike __setitem__())
appendlist(key,item)添加item到和Key关联的内部list.
setlistdefault(key,list)setdefault有一点不同,它接受列表而不是单个Value作为参数
lists()和items()有一点不同, 它会返回key的所有值,作为一个列表
urlencode()返回一个以查询字符串格式进行格式化后的字符串,例如:“a=2&b=3&b=5”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django(4)表单 的相关文章

随机推荐

  • Git的图形化界面如何使用

    一 什么是Gitee gitee https gitee com xff08 中文名 xff1a 码云 xff0c 原名 Git 64 OSC xff09 是开源中国推出的基于git的代码托管服务 国内访问GitHub https gith
  • 重要性抽样方法实例分享

    经过matlab爱好者公众号连续不断的推送Monte Carlo方法 xff0c 所以我们对其了解透彻了吗 xff1f NO xff01 当然还得日日精进 大家经常使用的Monte Carlo方法并不完美 xff0c 我估计大多数人也听不懂
  • 你们要的网页版matlab来了,速领!

    近来有不少小伙伴在公众号里面问网页版matlab xff0c 之前公众号确实是在菜单中给大家分享过一款网页版matlab编译环境 xff0c 不过由于公众号菜单更新换代 xff0c 已经将相关分享入口给取消了 xff0c 为了让大家更加方便
  • RHEL本地登录login出现permission denied的可能的解决办法

    OS xff1a RHEL7 6 开机后发现在本地使用root和非root用户登录 xff0c 输入用户名密码后 xff0c 都会出现permission denied xff0c 没有办法进入到系统 在网上查了很多资料 xff0c 看到这
  • Updating crates.io index 速度慢的解决办法

    Rust社区公开的第三方包都集中在crates io网站上面 xff0c 他们的文档被自动发布到doc rs网站上 Rust提供了非常方便的包管理器cargo xff0c 它类似于Node js的npm和Python的pip 但cargo不
  • SecureCRT 密码解密

    SecureCRT xff08 8 以上 xff09 配置的密码存放在 Config Sessions下面的ini文件中 xff0c 内容如下 xff1a S Username 61 S Monitor Password V2 61 S P
  • AD10 四层板经验(层的性质)

    层的性质 xff1a 内部层有两种 xff1a plane和layer xff0c 他们的区别如下 xff1a plane是所有Layer的其中一个 xff0c Layer是指层 xff0c 例如有常见的信号层Signal Layers 顶
  • Centos7下httpd最新版本安装或者更新至最新版本

    查找Centos上软件库里的httpd版本 yum info httpd yum info httpd 已加载插件 xff1a fastestmirror Loading mirror speeds from cached hostfile
  • 修改git远程仓库地址

    由于git仓库的地址发生了变化 xff0c 需要修改仓库地址才能push 查看本地工程git仓库关联的远程仓库地址 xff1a span class token function git span remote v 删除本地关联的远程仓库地
  • INSTALL_FAILED_NO_MATCHING_ABIS 的解决办法

    在Android模拟器上安装apk的时候出现 xfeff xfeff INSTALL FAILED NO MATCHING ABIS 这个错误提示的解决办法 是由于使用了native libraries 该native libraries
  • IntelliJ IDEA 控制台中文乱码

    1 预热 刚刚接触IntelliJ IDEA几天 xff0c 在易用性方面的确比Eclipse好很多 xff0c 比较智能 xff0c 各种插件 工具都已经集成 xff0c 和Mac OS X类似 开箱即用 但是还是老大难问题 中文乱码 x
  • unable to start the monitor on 4454 ,an other instance is problaly using the same port

    在打开idea studio后 xff0c 再打开android studio xff0c 或者反过来 xff0c 打开项目的时候就会报 xff1a unable to start the monitor on 4454 xff0c an
  • windows中为cmd设置代理

    在CMD环境下设置代理可能不是很常用 xff0c 但是某些情况下还是可能会用到 xff0c 比如有些资源网站被墙了 xff0c 此时你如果想访问这些资源时 xff0c 只能通过代理来访问相应的资源 xff0c 而你需要在CMD环境下下载墙外
  • version `GLIBCXX_3.4.21' not found 解决办法

    在安装cmake3 5 1运行 bootstrap的时候出现如下提示 xff1a gmake cmake 是最新的 span class hljs header usr soft cmake 3 5 1 Bootstrap cmk cmak
  • Oracle死锁查询及处理

    一 数据库死锁的现象 程序在执行的过程中 xff0c 点击确定或保存按钮 xff0c 程序没有响应 xff0c 也没有出现报错 二 死锁的原理 当对于数据库某个表的某一列做更新或删除等操作 xff0c 执行完毕后该条语句不提 交 xff0c
  • Ubuntu 18.04添加中文输入法

    找到设置 xff1a 点击 Manager Installed Languages 出现下图提示 xff1a Keyboard input method system 里面有Ibus XIM fcitx none 三种输入架构 xff0c
  • KEIL问题【打开文件太多造成任何按钮都不可点】【Keil4 编译时出现RL-ARM is not allowed with this license 】【 局部变量仿真显示not in scope】

    SYD8801是一款低功耗高性能蓝牙低功耗SOC xff0c 集成了高性能2 4GHz射频收发机 32位ARM Cortex M0处理器 128kB Flash存储器 以及丰富的数字接口 SYD8801片上集成了Balun无需阻抗匹配网络
  • Django(2)模板、标签

    文章目录 一 使用Django模板修改页面二 Django模板标签 变量 列表 字典 过滤器1 default2 length3 filesizeformat4 date5 truncatechars6 safe if else标签 for
  • Django(3)模型

    文章目录 一 Django 模型 ORM二 数据库配置三 定义模型 xff08 创建数据表 xff09 四 数据库基本操作 插入数据 获取数据 xff08 1 xff09 查询所有的数据行 xff08 2 xff09 where条件查询 x
  • Django(4)表单

    文章目录 一 概述二 GET方法三 POST方法四 Request对象五 QueryDict对象 此文章参考菜鸟教程 xff1a Django 表单 菜鸟教程 runoob com Django版本 xff1a span class tok