本节主要介绍一下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框架表单基础的更多相关文章

  1. django from表单基础知识点

    今日概要: - 内容拾遗 - 分页 - Form验证 1.内容拾遗 - 新URL -提交时,保留之前的内容? - 对话框 - var data = $('#fmForm表单的ID').serializ ...

  2. python运维开发(十九)----Django后台表单验证、session、cookie、model操作

    内容目录: Django后台表单验证 CSRF加密传输 session.cookie model数据库操作 Django后台Form表单验证 Django中Form一般有2种功能: 1.用于做用户提交 ...

  3. django form表单验证

    一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...

  4. 《JAVASCRIPT高级程序设计》表单基础知识和文本框脚本

    在HTML中,表单是由<form>元素来表示,在javascript中,表单对应的是HTMLFormElement类型,它具有一些独有的属性和方法: 一.表单基础知识 1.取得表单的方式 ...

  5. django from表单验证

    django from表单验证   实现:表单验证 工程示例: urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from djan ...

  6. Javascript高级编程学习笔记(73)—— 表单(1)表单基础

    表单 JS最初的一个用途就是帮助服务器分担处理表单的责任 时至今日,虽然web应用以及JS都有了长足的发展,但是表单依然是现在web应用中比较重要的部分. 因为默认的表单控件很丑,所以有时候我们会使用 ...

  7. django Form表单的使用

    Form django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm 关于django的表单系统,主要分两种 基于django.forms.Form ...

  8. Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)

    一.Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session 1 2 3 4 5 ...

  9. tp框架表单提交注意!不要提交到当前方法

    tp框架  表单提交到当前方法,会重复执行显示部分和保存部分的代码.导致不知名的错误.

  10. django创建表单以及表单数据类型和属性

    08.15自我总结 关于django的表单不同关系之间的创建 一.不同关系之间的创建 1.一对一 举例 母表:userinfo id name age 1 张三 12 2 李四 58 字表:priva ...

随机推荐

  1. 【工具分享】红队重点资产指纹识别 -- P1finger -0.02(最新版本)

    工具介绍: P1finger 红队行动下的重点资产指纹识别工具.P1finger 是一个重点资产指纹识别的工具,旨在通过HTTP请求特征来识别目标系统.其主要特点包括: 语言和实现: 语言:使用Go语 ...

  2. 【工程应用十二】Bayer图像格式中Hamilton-Adams及Zhang Wu 基于LMMSS算法的Demosaic过程优化。

    Demosaic,中文直接发翻译为去马赛克, 但是其本质上并不是去除马赛克,这让很多第一次接触这个名词或者概念的人总会想的更多.因此,一般传感器在采集信息时一个位置只采集RGB颜色中的一个通道,这样可 ...

  3. python 或者 pyspark 和 java 交互, pyspark 里怎么调用自定义的 jar 包

    1. python 直接访问 jar 里面的类 先定义java文件,然后要访问java class, 需要有gateway server 和 entrypoint, 到时候python就可以连接上ga ...

  4. Unity中的三种渲染路径

    Unity中的渲染路径 Unity的渲染路径 在Unity里,渲染路径(Rendering Path)决定了光照是如何应用到Unity Shader中的.因此,我们只有为Shader正确地选择和设置了 ...

  5. 自我介绍&博客指南&博客更新日志

    自我介绍 目前高中在读生 专用网名:Alloverzyt,端木 傲 忍 入站必读: 我所爱之人,敬祝 本人博客及动态免责声明 学历简述:成都市棕北小学,成都市石室联合中学,成都市石室中学 博客指南 本 ...

  6. react -- 什么是jsx

    概念:JSX 就是js和xml的缩写,表示在js代码中编写html模板结构,他是react中编写UI模板的方式 优势:html的声明式模板写法  js的可编程能力

  7. 56.dom如何映射数据

    所谓的映射机制就是 页面的标签和js中获取的页面标签对象,无论修改哪一个,另一个都会随之更新 : 映射原理:浏览器在渲染页面的时候给每一个元素都设置了很多内置的属性(包含样式的),     当我们在J ...

  8. JavaScript原型链污染探讨

    如果你想弄明白什么怎样才可以实现JavaScript的原型链污染,那么你首先需要弄清楚两个东西,那就是__proto__和prototype. 到底什么才是__proto__和prototype? 那 ...

  9. NetCore项目发布对前端项目进行打包合并发布

    在某个小项目中, api使用asp.net core 3.x 编写, UI页面则使用Vuejs. 正常情况下, 项目右键的发布只会发布api项目,而不会管Vuejs的项目. 所以通过简单的改造,在发布 ...

  10. 在 K8s 中快速部署使用 GitLab 并构建 DevOps 项目

    作者:张海立,KubeSphere 社区 Ambassador.Talented Speaker,社区用户委员会上海站副站长 原文链接:https://kubesphere.com.cn/blogs/ ...