详解Django中的form库的使用

作者:goldensun 时间:2022-05-16 00:13:50 

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类。 在这个例子中,我们只有一个`` <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
<tr><th><label for="id_subject">Subject:</label></th><td><input type="text" name="subject" id="id_subject" /></td></tr>
<tr><th><label for="id_email">Email:</label></th><td><input type="text" name="email" id="id_email" /></td></tr>
<tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr>

为了便于访问,Django用`` <label>`` 标志,为每一个字段添加了标签。 这个做法使默认行为尽可能合适。

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


>>> print f.as_ul()
<li><label for="id_subject">Subject:</label> <input type="text" name="subject" id="id_subject" /></li>
<li><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></li>
<li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li>
>>> print f.as_p()
<p><label for="id_subject">Subject:</label> <input type="text" name="subject" id="id_subject" /></p>
<p><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></p>
<p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p>

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

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


>>> print f['subject']
<input type="text" name="subject" id="id_subject" />
>>> print f['message']
<input type="text" name="message" id="id_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型对象。

标签:Django,form
0
投稿

猜你喜欢

  • Python Numpy计算各类距离的方法

    2022-12-03 13:52:53
  • jQuery 1.4新特性及其变化(上)

    2010-01-18 16:33:00
  • 教你为MySQL数据库换挡加速

    2010-03-03 16:58:00
  • 作为Web开发人员,我为什么喜欢Google Chrome浏览器

    2011-08-29 15:37:47
  • Python自定义函数计算给定日期是该年第几天的方法示例

    2021-07-25 02:38:10
  • 对python中的控制条件、循环和跳出详解

    2022-03-08 00:41:44
  • ASP 调用dll及封装dll实例

    2011-03-17 10:47:00
  • python使用pip安装SciPy、SymPy、matplotlib教程

    2022-03-05 01:46:12
  • Python学习笔记(二)基础语法

    2022-03-08 19:55:34
  • python模块导入方式浅析步骤

    2023-05-13 01:08:13
  • Tensorflow加载预训练模型和保存模型的实例

    2022-06-03 05:55:41
  • np.dot()函数的用法详解

    2023-06-14 02:12:21
  • 利用ImageAI库只需几行python代码实现目标检测

    2023-06-25 15:03:28
  • tensorflow实现逻辑回归模型

    2022-01-18 20:10:28
  • Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例

    2022-11-08 14:50:22
  • 在matplotlib中改变figure的布局和大小实例

    2022-07-09 00:45:11
  • Python手动或自动协程操作方法解析

    2023-06-30 11:38:41
  • Python爬虫之批量下载喜马拉雅音频

    2022-09-25 20:18:27
  • 对Python信号处理模块signal详解

    2021-08-20 04:06:11
  • 基于Python中random.sample()的替代方案

    2021-01-16 18:41:07
  • asp之家 网络编程 m.aspxhome.com