Django表单——概述

参考文献:

https://docs.djangoproject.com/zh-hans/2.0/topics/forms/

HTML 表单

一个表单必须明确两个要素:

  • where: 应返回与用户输入相对应的数据的URL
  • how:应该返回数据的HTTP方法

GET和POST

GET和POST是处理表单时唯一使用的HTTP方法。

使用POST方法返回Django的登录表单,其中浏览器捆绑表单数据,对其进行编码以进行传输,将其发送到服务器,然后接收其响应。

相反,GET将提交的数据捆绑成一个字符串,并使用它来组成一个URL。 URL包含必须发送数据的地址,以及数据键和值。如果您在Django文档中进行搜索,您可以看到这一点,该文档将生成https://docs.djangoproject.com/search/?q=forms&release=1形式的URL。

GET和POST通常用于不同的目的。

任何可用于更改系统状态的请求(例如,在数据库中进行更改的请求)都应使用POST。 GET仅应用于不影响系统状态的请求。

GET也不适用于密码表单,因为密码会出现在URL中,因此也会出现在浏览器历史记录和服务器日志中,所有这些都是纯文本形式。它既不适用于大量数据,也不适用于二进制数据,如图像。对管理表单使用GET请求的Web应用程序存在安全风险:攻击者可以很容易地模仿表单的请求以访问系统的敏感部分。 POST与Django的CSRF保护等其他保护措施相结合,可以更好地控制访问。

另一方面,GET适用于Web搜索表单之类的内容,因为表示GET请求的URL可以轻松加入书签,共享或重新提交。

Django在表单中的作用

处理表格是一项复杂的业务。 考虑Django的管理员,其中可能需要准备多种不同类型的数据以便在表单中显示,呈现为HTML,使用方便的界面进行编辑,返回到服务器,验证和清理,然后保存或传递 进一步处理。

Django的表单功能可以简化和自动化这项工作的大部分内容,并且也可以比大多数程序员在他们自己编写的代码中更安全地执行它。

Django处理表单中涉及的工作的三个不同部分:

  • 准备和重组数据以使其为渲染做好准备
  • 为数据创建HTML表单
  • 接收和处理客户提交的表格和数据

可以编写手动完成所有这些操作的代码,但Django可以为您完成所有操作。

在Django中的表单

我们简要描述了HTML表单,但HTML <form>只是所需机制的一部分。

在Web应用程序的上下文中,“表单”可能指的是HTML <form>,或者指向生成它的Django表单,或者指向提交时返回的结构化数据,或者指向端到端工作集合 这些部分。

Django中的表单类

这个组件系统的核心是Django的Form类。 与Django模型描述对象的逻辑结构,其行为以及其部件向我们表示的方式非常相似,Form类描述了一个表单并确定它的工作原理和显示方式。

类似于模型类的字段映射到数据库字段的方式,表单类的字段映射到HTML表单<input>元素。 (ModelForm通过Form将模型类的字段映射到HTML表单<input>元素;这是Django管理员所基于的。)

表单的字段本身就是类; 他们管理表单数据并在提交表单时执行验证。 DateField和FileField处理非常不同类型的数据,并且必须使用它做不同的事情。

表单字段在浏览器中表示为HTML“小部件” - 一个用户界面机制。 每个字段类型都有一个适当的默认Widget类,但可以根据需要覆盖它们。

实例化,处理和呈现表单

在Django中渲染对象时,我们通常会:

  1. 在视图中获取它(例如,从数据库中获取它)
  2. 将它传递给模板上下文
  3. 使用模板变量将其扩展为HTML标记

在模板中渲染表单涉及与渲染任何其他类型的对象几乎相同的工作,但存在一些关键差异。

对于不包含数据的模型实例,在模板中对它执行任何操作很少有用。 另一方面,渲染未填充的表单非常有意义 - 这就是我们希望用户填充它时所做的事情。

因此,当我们在视图中处理模型实例时,我们通常会从数据库中检索它。 当我们处理表单时,我们通常在视图中实例化它。

当我们实例化一个表单时,我们可以选择将其留空或预先填充它,例如:

  • 来自已保存模型实例的数据(如用于编辑的管理表单)
  • 我们从其他来源整理的数据
  • 从先前的HTML表单提交中收到的数据

最后一个案例是最有趣的,因为它使用户不仅可以阅读网站,还可以将信息发回给它。

创建表单

在HTML中新建一个简单的表单,如下:

<form action="/your-name/" method="post">
    <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>

在Django中新建一个表单

表单类,如下:

# forms.py

from django import forms

class NameForm(forms.Form):
    your_name = forms.CharField(label=‘Your name‘, max_length=100)

这定义了一个Form类,其中包含一个字段(your_name)。 我们已经在字段中应用了一个人性化的标签,当它被渲染时将出现在<label>中(尽管在这种情况下,我们指定的标签实际上与我们省略它时将自动生成的标签相同)。

字段的最大允许长度由max_length定义。 这样做有两件事。 它在HTML <input>上放置了一个maxlength =“100”(因此浏览器应该阻止用户首先输入超过该数量的字符)。 这也意味着当Django从浏览器收回表单时,它将验证数据的长度。

Form实例有一个is_valid()方法,该方法为其所有字段运行验证例程。 调用此方法时,如果所有字段都包含有效数据,则它将:

  • 返回True
  • 将表单的数据放在其cleaning_data属性中。

整个表单,第一次呈现时,将如下所示:

<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" maxlength="100" required />

请注意,它不包含<form>标记或提交按钮。 我们必须在模板中提供这些。

视图函数view

发送回Django网站的表单数据由视图处理,通常与发布表单的视图相同。 这允许我们重用一些相同的逻辑。

要处理表单,我们需要在我们希望它发布的URL的视图中实例化它:

# views.py

from django.http import HttpResponseRedirect
from django.shortcuts import render

from .forms import NameForm

def get_name(request):
    # if this is a POST request we need to process the form data
    if request.method == ‘POST‘:
        # create a form instance and populate it with data from the request:
        form = NameForm(request.POST)
        # check whether it‘s valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # ...
            # redirect to a new URL:
            return HttpResponseRedirect(‘/thanks/‘)

    # if a GET (or any other method) we‘ll create a blank form
    else:
        form = NameForm()

    return render(request, ‘name.html‘, {‘form‘: form})

如果我们使用GET请求到达此视图,它将创建一个空表单实例并将其放置在要呈现的模板上下文中。 这是我们第一次访问URL时可能发生的情况。

如果使用POST请求提交表单,视图将再次创建一个表单实例并使用来自请求的数据填充它:form = NameForm(request.POST)这称为“将数据绑定到表单”(现在是 一种约束形式)。

我们称之为表单的is_valid()方法; 如果它不是True,我们将返回带有表单的模板。 这次表单不再为空(未绑定),因此HTML表单将填充先前提交的数据,可以根据需要对其进行编辑和更正。

如果is_valid()为True,我们现在可以在其cleaning_data属性中找到所有经过验证的表单数据。 我们可以使用此数据更新数据库或进行其他处理,然后再将HTTP重定向发送到浏览器,告诉它下一步该去哪里。

模板template

原文地址:https://www.cnblogs.com/aric-zhu/p/9373744.html

时间: 2024-10-05 23:55:10

Django表单——概述的相关文章

7Python全栈之路系列之Django表单

Python全栈之路系列之Django表单 从Request对象中获取数据 HttpRequest对象包含当前请求URL的一些信息: 熟悉/方法 描述 例如 request.path 除域名以外的请求路径 /hello/ request.get_host() 访问的域名 127.0.0.1:8000" or www.example.com request.get_full_path() 请求路径,可能包含查询字符串 /hello/?print=true request.is_secure() 是

Django表单处理

我们会从手工打造一个简单的搜索页面开始,看看怎样处理浏览器提交而来的数据.然后我们开始使用Django的forms框架. 搜索 在web应用上,有两个关于搜索获得巨大成功的故事:Google和Yahoo,通过搜索,他们建立了几十亿美元的业务.几乎每个网站都有很大的比例访问量来自这两个搜索引擎.甚至,一个网站是否成功取决于其站内搜索的质量.因此,在我们这个网站添加搜索功能看起来好一些. 开始,在URLconf (mysite.urls)添加搜索视图.添加类似(r'^search/$','mysit

django表单使用forms.ModelForm

win7 python2.7 django 1.6.5 因为使用数据库sqlite,项目中有models.py,所以使用方便的forms.ModelForm处理表单. 上传图像文件使用默认的defaultstorage. 1.settings.py里增加两行media的定义: #Media MEDIA_ROOT = 'e:/Depot/media' MEDIA_URL = '/media/' 2.models.py #coding: utf8 from django.db import mode

关于创建Django表单Forms继承BaseForm的问题

在创建Django表单时,因为需要验证用户输入的验证码是否正确,因此需要在session里提取当前验证码的值和POST提交过来的值进行比对,如图: 1 form.py 2 3 from django import forms 4 5 class LoginForms(forms.Form): 6 check_code = forms.CharField() 7 def clean_check_code(self): 8 if self.request.session.get('CheckCode

Django表单API详解

声明:以下的Form.表单等术语都指的的广义的Django表单. Form要么是绑定了数据的,要么是未绑定数据的. 如果是绑定的,那么它能够验证数据,并渲染表单及其数据,然后生成HTML表单.如果未绑定,则无法进行验证(因为没有数据可以验证!),但它仍然可以以HTML形式呈现空白表单. 表单类原型:class Form[source] 若要创建一个未绑定的Form实例,只需简单地实例化该类: f = ContactForm() 若要绑定数据到表单,可以将数据以字典的形式传递给Form类的构造函数

Django表单上传

任务描述:实现表单提交(上传文件) 1.项目目录: 2.源代码: regist.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>regist</title> </head> <body> <h3>regist</h3> <hr> <

Django 表单

学习参考:http://www.runoob.com/django/django-form.html HTTP 请求 HTTP协议以"请求-回复"的方式工作.客户发送请求时,可以在请求中附加数据.服务器通过解析请求,就可以获得客户传来的数据,并根据URL来提供特定的服务. GET 方法 我们在之前项目的C:\Users\XCC\HelloWorld\HelloWorld路径下创建一个 search.py 文件,用于接收用户的请求: # -*- coding: utf-8 -*- fro

Django表单form ajax应用(上)

一.项目说明 学习django版本1.8.2,把之前零散学习的知识整合下,主要涉及到: 项目开始,ajax数据调用,注册,数据录入,数据修改,数据删除,数据建模等完成一个完整的前后台功能简单的web.数据库默认用sqlite 1.创建djano项目:     $cd  /data1/DjangoProject/     $django-admin startproject School     $cd School     $python manage.py startapp student  

17.Django表单验证

Django提供了3中方式来验证表单 官网文档:https://docs.djangoproject.com/en/1.9/ref/validators 1.表单字段验证器 a.引入:from django.core.exceptions import ValidationError b.定义验证方法,验证不通过抛一个ValidationError异常 def validate_name(value): 验证不通过 raise ValidationError("%s的信息已经存在"%v