Django框架表单基础
本节主要介绍一下Django框架表单(Form)的基础知识。Django框架提供了一系列的工具和库来帮助设计人员构建表单,通过表单来接收网站用户的输入,然后处理以及响应这些用户的输入。
6.1.1 HTML表单
Django框架表单是在HTML模板中设计完成的,其实类似于传统HTML Form表单的应用。在传统HTML页面中,表单是由“<form>...</form>”标签实现的,通过在其中添加相关的一些元素(例如文本输入框、单选框、复选框、文本域、重置按钮和提交按钮等),允许终端用户通过表单输入相关的数据信息,然后发送到服务端(后台)。Django框架表单也实现了相应的功能,只不过要遵循Django框架标准来设计。
在HTML中,有一些表单元素(例如文本输入框)是非常简单且内置于HTML中的,而有一些表单元素会比较复杂(例如日期选择控件、滑块控件等),一般需要通过使用JavaScript、CSS以及<input>等来实现效果。
Django框架表单同样如此,定义时需要满足以下两项常规标准:
负责响应用户输入数据的URL地址(action属性)。
数据请求时使用的HTTP方法(method属性:GET、POST)。
例如,在Django框架内置的Admin(管理员)登录表单中,就包含如下一些常规<input>元素类型:
用户名:type="text"。
密码:type="password"。
登录按钮:type="submit"。
action属性指定的URL地址:“/admin/”。
method属性指定的HTTP方法:“POST”。
当用户单击<input type="submit" value="Log in">按钮元素时,提交响应就会被触发,然后表单数据会被发送到“/admin/”地址上去。
6.1.2 HTTP方法:GET和POST
Django框架处理表单时只会用到GET和POST这两种HTTP方法。Django的登录表单需要使用POST方法传输数据。当使用POST方法时,浏览器会封装表单数据,为了传输安全还会进行必要编码,然后发送到服务端并接收其响应。
相比之下,GET方法会将提交的数据绑定到一个字符串中,并用该字符串来组成一个URL地址。该URL地址包含了数据要发送的地址以及一些键值对应的数据。例如,在Django官方文档(https://docs.djangoproject.com)中进行一次搜索,就会生成一个类似“https://docs.djangoproject.com/search/?q=forms&release=1”的URL地址,这个就是GET方式。
GET和POST这两种HTTP方法通常用于不同的目的。任何可能用于更改系统状态的请求应该使用POST方法,比如一个更改数据库的请求;GET方法应该只被用于不会影响系统状态的请求。
还有,GET方法也不适合密码表单,因为密码会出现在URL地址字符串中,自然也会被记录在浏览器的历史记录以及服务器的日志中,而且都是纯文本的形式,因此安全性就无法保证。GET方法同样也不适合处理大量的字符串数据或二进制数据,比如图片和视频这类的。
在Web应用的管理表单中使用GET请求具有安全隐患:攻击者很容易通过模拟请求来访问系统的敏感数据,因此Django Admin模块选择使用POST方法。在Django框架模板中,POST方法通过与CSRF protection这样的保护措施配合使用,能对访问提供更多的控制。
GET方法也不是完全无用武之地的。GET方法适用于类似网页搜索表单这样的场景,这时GET请求的URL地址很容易被保存为书签,便于用户分享或重新提交。因此,在Django官方文档中进行搜索,就使用了GET方法。
6.1.3 Django在表单中的角色
Django框架处理表单是一件比较复杂的事情。研究一下Django框架的Admin模块,就会发现许多不同类型的数据可能需要在一张表单中完成,然后渲染到HTML模板中呈现,还需要使用便捷的界面进行编辑、上传到服务器、验证和清理数据,最后还要保存或跳过进行下一步处理。
Django框架的表单功能可以简化和自动化上述工作的大部分内容,并且也能比大多数设计人员自己编写代码去实现表现得更安全一些。
Django框架会处理涉及表单的3个不同部分:
准备并重组数据,以便下一步的渲染。
为数据创建HTML表单。
接收并处理客户端提交的表单及数据。
虽然设计人员可以通过手动编写代码来实现上述功能,不过Django框架表单的内置功能已能够完成这些工作。
6.1.4 Form类
Django框架表单系统的核心组件是Form类,其与Django模型描述对象的逻辑结构、行为以及呈现内容的方式是大致相同的。Form类描述了表单并决定其如何工作以及如何呈现。
类似于模型类的字段映射到数据库字段的方式,ModelForm模型类的字段会通过表单类的字段映射到HTML表单的<input>元素中。Django框架的Admin模块就是基于此设计实现的。
表单字段本身也是类,用于管理表单数据并在提交表单时执行验证。DateField和FileField处理的数据类型差别很大,所以必须用来处理不同的字段。
在浏览器中,表单字段以HTML元素(控件类)的形式展现。每个字段类型都有与之相匹配的控件类,但必要时可以进行覆盖。
6.1.5 实例化、处理和渲染表单
在Django框架表单中渲染一个对象的时候,其流程通常如下:
(1)在视图中获取对象(例如从数据库中取出)。
(2)将对象传递给模板上下文。
(3)使用模板变量将对象扩展为HTML标签。
在模板中渲染表单与渲染任何其他类型的对象几乎一样,但是存在一些关键性的差异。
如果模型实例不包含数据,则在模板中对其做任何处理几乎没什么用,但完全有理由来渲染一张空表单,通常当我们希望用户来填充的时候就会这么做。因此,当在视图中处理模型实例时,一般从数据库中获取这些对象;当处理表单时,一般在视图中实例化这些对象。
实例化表单时,可以选择让表单为空或预先填充数据,数据来源可以是:
(1)用来保存模型实例的数据(例如在管理编辑表单的情况下)。
(2)从其他来源获取的数据。
(3)从前面一个HTML表单提交过来的数据。
6.1.6 创建一个表单
假设希望在网站上创建一个最简单的表单用来获取用户的名字,通常只需要在模板中使用如下类似的代码:
【代码6-1】
<form action="/get-name/" method="get">
<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" value="{{ current_name }}">
<input type="submit" value="OK">
</form>
【代码分析】
在第01行代码中,action属性通知浏览器将表单数据提交到URL地址"/get-name/"上,method属性定义使用GET方法。
在第03行代码中,定义了一个<input type="text" />的文本输入框,用于用户输入姓名。同时,value属性定义为一个上下文变量current_name,如果该变量存在,则其值将会预先填充到表单中。
在第04行代码中,定义了一个<input type="submit" />的提交按钮。
对于【代码6-1】中定义的表单,需要一个视图来渲染这个包含HTML表单的模板,并能提供适当的{{ current_name }}字段。提交表单时,发送给服务器的“GET”请求将包含表单数据。
然后,还需要一个与该URL地址("/get-name/")相对应的视图,该视图将在请求中找到相应的键-值对,然后对其进行处理。
同时,可能还需要浏览器在表单提交之前进行一些字段验证,或者使用更复杂的字段以允许用户做类似日期选择的操作等。这时,通过Django框架可以很容易地完成以上大部分工作。
Django框架表单基础的更多相关文章
- django from表单基础知识点
今日概要: - 内容拾遗 - 分页 - Form验证 1.内容拾遗 - 新URL -提交时,保留之前的内容? - 对话框 - var data = $('#fmForm表单的ID').serializ ...
- python运维开发(十九)----Django后台表单验证、session、cookie、model操作
内容目录: Django后台表单验证 CSRF加密传输 session.cookie model数据库操作 Django后台Form表单验证 Django中Form一般有2种功能: 1.用于做用户提交 ...
- django form表单验证
一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...
- 《JAVASCRIPT高级程序设计》表单基础知识和文本框脚本
在HTML中,表单是由<form>元素来表示,在javascript中,表单对应的是HTMLFormElement类型,它具有一些独有的属性和方法: 一.表单基础知识 1.取得表单的方式 ...
- django from表单验证
django from表单验证 实现:表单验证 工程示例: urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from djan ...
- Javascript高级编程学习笔记(73)—— 表单(1)表单基础
表单 JS最初的一个用途就是帮助服务器分担处理表单的责任 时至今日,虽然web应用以及JS都有了长足的发展,但是表单依然是现在web应用中比较重要的部分. 因为默认的表单控件很丑,所以有时候我们会使用 ...
- django Form表单的使用
Form django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm 关于django的表单系统,主要分两种 基于django.forms.Form ...
- Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)
一.Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session 1 2 3 4 5 ...
- tp框架表单提交注意!不要提交到当前方法
tp框架 表单提交到当前方法,会重复执行显示部分和保存部分的代码.导致不知名的错误.
- django创建表单以及表单数据类型和属性
08.15自我总结 关于django的表单不同关系之间的创建 一.不同关系之间的创建 1.一对一 举例 母表:userinfo id name age 1 张三 12 2 李四 58 字表:priva ...
随机推荐
- 【工具分享】红队重点资产指纹识别 -- P1finger -0.02(最新版本)
工具介绍: P1finger 红队行动下的重点资产指纹识别工具.P1finger 是一个重点资产指纹识别的工具,旨在通过HTTP请求特征来识别目标系统.其主要特点包括: 语言和实现: 语言:使用Go语 ...
- 【工程应用十二】Bayer图像格式中Hamilton-Adams及Zhang Wu 基于LMMSS算法的Demosaic过程优化。
Demosaic,中文直接发翻译为去马赛克, 但是其本质上并不是去除马赛克,这让很多第一次接触这个名词或者概念的人总会想的更多.因此,一般传感器在采集信息时一个位置只采集RGB颜色中的一个通道,这样可 ...
- python 或者 pyspark 和 java 交互, pyspark 里怎么调用自定义的 jar 包
1. python 直接访问 jar 里面的类 先定义java文件,然后要访问java class, 需要有gateway server 和 entrypoint, 到时候python就可以连接上ga ...
- Unity中的三种渲染路径
Unity中的渲染路径 Unity的渲染路径 在Unity里,渲染路径(Rendering Path)决定了光照是如何应用到Unity Shader中的.因此,我们只有为Shader正确地选择和设置了 ...
- 自我介绍&博客指南&博客更新日志
自我介绍 目前高中在读生 专用网名:Alloverzyt,端木 傲 忍 入站必读: 我所爱之人,敬祝 本人博客及动态免责声明 学历简述:成都市棕北小学,成都市石室联合中学,成都市石室中学 博客指南 本 ...
- react -- 什么是jsx
概念:JSX 就是js和xml的缩写,表示在js代码中编写html模板结构,他是react中编写UI模板的方式 优势:html的声明式模板写法 js的可编程能力
- 56.dom如何映射数据
所谓的映射机制就是 页面的标签和js中获取的页面标签对象,无论修改哪一个,另一个都会随之更新 : 映射原理:浏览器在渲染页面的时候给每一个元素都设置了很多内置的属性(包含样式的), 当我们在J ...
- JavaScript原型链污染探讨
如果你想弄明白什么怎样才可以实现JavaScript的原型链污染,那么你首先需要弄清楚两个东西,那就是__proto__和prototype. 到底什么才是__proto__和prototype? 那 ...
- NetCore项目发布对前端项目进行打包合并发布
在某个小项目中, api使用asp.net core 3.x 编写, UI页面则使用Vuejs. 正常情况下, 项目右键的发布只会发布api项目,而不会管Vuejs的项目. 所以通过简单的改造,在发布 ...
- 在 K8s 中快速部署使用 GitLab 并构建 DevOps 项目
作者:张海立,KubeSphere 社区 Ambassador.Talented Speaker,社区用户委员会上海站副站长 原文链接:https://kubesphere.com.cn/blogs/ ...