本节主要介绍一下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. 充分利用HarmonyOS NEXT:开发者的全功能指南

    随着技术的不断进步,开发者们面临着如何在复杂的技术环境中创造出卓越应用的挑战.在当今的科技浪潮中,如何抓住创新的机遇?HarmonyOS NEXT的发布,带来了全新的机遇和功能.本文将探讨开发者如何充 ...

  2. 通过 GitHub Actions 实现代码的自动编译和发布

    GitHub Actions 是一个非常强大的工具,可以用来实现各种自动化任务,包括自动编译和发布 release.以下是一个基本的工作流程,展示如何使用 GitHub Actions 实现这一目标: ...

  3. Java面试集锦(一)

    计算机网络 摘要:1. 在浏览器中输入url地址 显示主页的过程,整个过程会使用哪些协议 image.jpeg总体来说分为以下几个过程: DNS解析 TCP连接 发送HTTP请求 服务器处理请求并返回 ...

  4. 结合mysql 架构分析SQL查询语句和更新语句的执行

    结合mysql 架构分析SQL查询语句和更新语句的执行 一:基础架构 mysql分为Server层和存储引擎层 Server层 涵盖了大多数mysql的核心服务功能,以及所有内置的函数(例如日期.加密 ...

  5. 用Python实现阿拉伯数字转换成中国汉字

    要将阿拉伯数字转换成中国汉字表示的数字,我们需要一个映射表来转换每个数字,并且处理不同位数的数字(如十.百.千.万等). 1. Python实现阿拉伯数字转换成中国汉字 下面是一个完整的Python代 ...

  6. SQL查折线图数据

    在做后台管理系统的时候,有很大概率是要与各种图表数据打交道, 那么如何通过SQL查出基本图表的数据呢,以折线图为例, X轴为日期,Y轴为统计数据,那么我们通过SQL如何查询出连续日期下的统计数据呢, ...

  7. Angular Material 18+ 高级教程 – CDK Portal

    前言 CDK Portal 是 Angular Material 对 Angular Dynamic Component (ViewContainerRef,TemplateRef,createCom ...

  8. RxJS 系列 – Observable & Creation Operators

    前言 RxJS 最大篇幅就是一堆的 operators, 但是那些概念并不多, 只要常用就能熟能生巧了. Observable 和 Subject 反而需要我们了解清楚. 所以这篇我们先来了解这 2 ...

  9. MDC – Work with Framework & Customize

    前言 在 MDC – Material Design, Angular Material, MDC, MWC, Lit 的关系 中, 我有提到基于 MDC 的 Framework 生态有多糟糕. 但它 ...

  10. html4,5 basic

    更新: 2021-06-15 游览器 href 和 base href 绝对路径和相对路径 在没有 base href 的情况下 href="/about.html" 就是从 do ...