详解Django中的form库的使用
admin
2023-07-31 02:25:33
0

Django带有一个form库,称为django.forms,这个库可以处理我们本章所提到的包括HTML表单显示以及验证。 接下来我们来深入了解一下form库,并使用她来重写contact表单应用。

Django的newforms库

在Django社区上会经常看到django.newforms这个词语。当人们讨论django.newforms,其实就是我们本章里面介绍的django.forms。

改名其实有历史原因的。 当Django一次向公众发行时,它有一个复杂难懂的表单系统:django.forms。后来它被完全重写了,新的版本改叫作:django.newforms,这样人们还可以通过名称,使用旧版本。 当Django 1.0发布时,旧版本django.forms就不再使用了,而django.newforms也终于可以名正言顺的叫做:django.forms。

表单框架最主要的用法是,为每一个将要处理的HTML的“

“ 定义一个Form类。 在这个例子中,我们只有一个“ “ ,因此我们只需定义一个Form类。 这个类可以存在于任何地方,甚至直接写在“ views.py“ 文件里也行,但是社区的惯例是把Form类都放到一个文件中:forms.py。在存放“ views.py“ 的目录中,创建这个文件,然后输入:

from django import forms

class ContactForm(forms.Form):
  subject = forms.CharField()
  email = forms.EmailField(required=False)
  message = forms.CharField()

这看上去简单易懂,并且很像在模块中使用的语法。 表单中的每一个字段(域)作为Form类的属性,被展现成Field类。这里只用到CharField和EmailField类型。 每一个字段都默认是必填。要使email成为可选项,我们需要指定required=False。

让我们钻研到Python解释器里面看看这个类做了些什么。 它做的第一件事是将自己显示成HTML:

>>> from contact.forms import ContactForm
>>> f = ContactForm()
>>> print f




为了便于访问,Django用“

默认输出按照HTML的<“ table“ >格式,另外有一些其它格式的输出:

>>> print f.as_ul()
  • >>> print f.as_p()

    请注意,标签

      、的开闭合标记没有包含于输出当中,这样你就可以添加额外的行或者自定义格式。

      这些类方法只是一般情况下用于快捷显示完整表单的方法。 你同样可以用HTML显示个别字段:

      >>> print f[\'subject\']
      
      >>> print f[\'message\']
      
      
      

      Form对象做的第二件事是校验数据。 为了校验数据,我们创建一个新的对Form象,并且传入一个与定义匹配的字典类型数据:

      >>> f = ContactForm({\'subject\': \'Hello\', \'email\': \'adrian@example.com\', \'message\': \'Nice site!\'})
      
      

      一旦你对一个Form实体赋值,你就得到了一个绑定form:

      >>> f.is_bound
      True
      
      

      调用任何绑定form的is_valid()方法,就可以知道它的数据是否合法。 我们已经为每个字段传入了值,因此整个Form是合法的:

      >>> f.is_valid()
      True
      
      

      如果我们不传入email值,它依然是合法的。因为我们指定这个字段的属性required=False:

      >>> f = ContactForm({\'subject\': \'Hello\', \'message\': \'Nice site!\'})
      >>> f.is_valid()
      True
      
      

      但是,如果留空subject或message,整个Form就不再合法了:

      >>> f = ContactForm({\'subject\': \'Hello\'})
      >>> f.is_valid()
      False
      >>> f = ContactForm({\'subject\': \'Hello\', \'message\': \'\'})
      >>> f.is_valid()
      False
      
      

      你可以逐一查看每个字段的出错消息:

      >>> f = ContactForm({\'subject\': \'Hello\', \'message\': \'\'})
      >>> f[\'message\'].errors
      [u\'This field is required.\']
      >>> f[\'subject\'].errors
      []
      >>> f[\'email\'].errors
      []
      
      

      每一个邦定Form实体都有一个errors属性,它为你提供了一个字段与错误消息相映射的字典表。

      >>> f = ContactForm({\'subject\': \'Hello\', \'message\': \'\'})
      >>> f.errors
      {\'message\': [u\'This field is required.\']}
      
      

      最终,如果一个Form实体的数据是合法的,它就会有一个可用的cleaned_data属性。 这是一个包含干净的提交数据的字典。 Django的form框架不但校验数据,它还会把它们转换成相应的Python类型数据,这叫做清理数据。

      >>> f = ContactForm({subject\': Hello, email: adrian@example.com, message: Nice site!})
      >>> f.is_valid()
      True
      >>> f.cleaned_data
      {message\': uNice site!, email: uadrian@example.com, subject: uHello}
      
      

      我们的contact form只涉及字符串类型,它们会被清理成Unicode对象。如果我们使用整数型或日期型,form框架会确保方法使用合适的Python整数型或datetime.date型对象。

      相关内容

      热门资讯

      500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
      定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
      65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
      Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
      scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
      pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
      小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
      微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
      python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
      Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...