首页 > 其他分享 >Django框架表单基础

Django框架表单基础

时间:2024-11-15 09:41:29浏览次数:1  
标签:框架 GET 表单 HTML POST 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框架可以很容易地完成以上大部分工作。

 

标签:框架,GET,表单,HTML,POST,Django
From: https://www.cnblogs.com/brucexia/p/18547386

相关文章

  • 基于 Python Django 的二手房间可视化系统分析
    博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • HTML区块方面的细节以及表单的使用
    一.HTML中区块元素和内联元素的区别1.HTML区块元素大多数HTML元素被定义为块级元素或内联元素。块级元素在浏览器显示时,通常会以新行来开始(和结束)。(即独占一行)实例:<h1>,<p>,<ul>,<table>2.HTML内联元素内联元素在显示时通常不会以新行开始。实例:<b>,<td>,......
  • 【01期】你能说说Spring框架中Bean的生命周期吗?
    前言:在当今技术快速迭代的大背景下,每位开发者都在不懈努力,学习最新的技术和框架,只为能在众多求职者中脱颖而出,获得理想中的大厂Offer。然而,面对网上海量且质量参差不齐的面试资料,许多朋友可能会感到迷茫和困惑。为了帮助大家更高效地准备面试,我精心搜集并整理了一份涵盖各大互......
  • python+vue基于django/flask新农村综合风貌展示平台java+nodejs+php-计算机毕业设计
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • 如何创建ANT DESIGN PRO框架的精简版
    react的框架ANTDESIGNPRO如何不通过下载来创建:1.按住键盘window+R打开面板并输入powershell2.打开过后我先切到D盘(尽量不要放在C盘里创建)3.然后先输入这个命令目的是 pro-cli来快速的初始化脚手架。npmi@ant-design/pro-cli-g4.输入这一行命令来创建文件名称......
  • 【cesium教程第一章框架基本介绍】
    Cesium教程第一章框架基本介绍一、Cesium是什么?二、CesiumAPI2.1CesiumAPI简介2.2Cesium核心类介绍三、总结一、Cesium是什么?Cesium是一个基于JavaScript的开源三维GIS前端框架,可用于创建具有非凡性能、精度、视觉效果和易用性的世界级多维地图。Cesium支持......
  • 开源框架NetCore
    推荐几个开箱即用的开源管理系统做项目   原文链接:https://blog.csdn.net/2401_83384536/article/details/140441595SCUIAdmin中后台前端解决方案SCUI是一个中后台前端解决方案,基于VUE3和elementPlus实现。使用最新的前端技术栈,提供各类实用的组件方便在业务开发时的......
  • 《Django 5 By Example》阅读笔记:p76-p104
    《Django5ByExample》学习第4天,p76-p104总结,总计29页。一、技术总结1.环境变量管理这里作者使用的是:python-decouple,本人在实际项目中使用的是python-dotenv,这里只是简单的使用,感觉两者差不多。2.评论功能评论功能设计的时候主要考虑两个方面:是否需要登录才能发表评论,评论......
  • [QT][NCNN][YOLOV8-SEG]使用ncnn框架部署yolov8-seg,外加qt进行界面可视化操作,用于图片
    yolov8seg_qt_ncnn使用ncnn框架部署yolov8-seg,外加qt进行界面可视化操作,用于图片和视频实例分割推理。Github地址:https://github.com/zhahoi/yolov8seg_qt_ncnn起一直以来自己做算法部署或者是模型推理,最后总是需要在命令行敲各种命令,然后通常借助opencv进行可视化。老......
  • 【泛微E9】建模查询列表(虚拟表单)实现批量更新
    查询列表代码块如下:<scripttype="text/javascript">/**请在下面编写JS代码*/jQuery(function($){varbtnname="批量更新人员的各级部门";jQuery(".wea-new-top").after("<divid='btnDiv1'></div>");//创建一个按......