django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm
关于django的表单系统,主要分两种
- 基于django.forms.Form
- 基于django.forms.ModelForm
Form表单的功能
- 自动生成HTML表单元素
- 检查表单数据的合法性
- 如果验证错误,重新显示表单(数据不会重置)
- 数据类型转换(字符类型的数据转换成相应的Python类型)
Form相关的对象包括
- Widget:用来渲染成HTML元素的工具,如:forms.Textarea对应HTML中的<textarea>标签
- Field:Form对象中的一个字段,如:EmailField表示email字段,如果这个字段不是有效的email格式,就会产生错误。
- Form:一系列Field对象的集合,负责验证和显示HTML元素
- Form Media:用来渲染表单的CSS和JavaScript资源
表单API
绑定的表单和未绑定的表单
若要创建一个未绑定的表单实例,只需简单地实例化该类:
>>> f = ContactForm()
若要绑定数据到表单,可以将数据以字典的形式传递给表单类的构造函数的第一个参数:
>>> data = {'subject': 'hello',
... 'message': 'Hi there',
... 'sender': 'foo@example.com',
... 'cc_myself': True}
>>> f = ContactForm(data)
Form.is_bound()
表单有两种状态,绑定,未绑定
- 如果是绑定的,那么它能够验证数据,并渲染表单及其数据成HTML。
- 如果是未绑定的,那么它不能够完成验证(因为没有可验证的数据!),但是仍然能渲染空白的表单成HTML。
使用表单来验证数据
1.验证合法性
Form.is_valid()
验证表单数据是否合法,返回True或者False,如果所有的字段都包含合法的数据,它将:
- True
- cleaned_data 属性中。
2、错误信息
Form.errors 返回错误字典
Form.errors.as_data() 返回一个字典,它映射字段到原始的ValidationError 实例
>>> f.errors.as_data() {'sender': [ValidationError(['Enter a valid email address.'])], 'subject': [ValidationError(['This field is required.'])]}
as_data()。
Form.errors.as_json(escape_html=False) 返回JSON 序列化后的错误
>>> f.errors.as_json() {"sender": [{"message": "Enter a valid email address.", "code": "invalid"}], "subject": [{"message": "This field is required.", "code": "required"}]}
.html() 就可以。
escape_html=True,这样错误消息将被转义而你可以直接在HTML 中使用它们。
Form.has_error(field,code=None)
True。
field 参数。
3、动态的初始值
Form.initial
在表单未绑定的情况下,为表单字段设置初始值,例如,你可能希望使用当前会话的用户名填充username字段。
例如:
>>> f=ContactForm(initial={'subject':'Hi there'})
这些值只显示在没有绑定的表单中,即使没有提供特定值它们也不会作为后备的值。
initial 在字段和表单实例化中都有定义,此时后者具有优先权:
>>> from django import forms >>> class CommentForm(forms.Form): ... name = forms.CharField(initial='class') ... url = forms.URLField() ... comment = forms.CharField() >>> f = CommentForm(initial={'name': 'instance'}, auto_id=False) >>> print(f) <tr><th>Name:</th><td><input type="text" name="name" value="instance" /></td></tr> <tr><th>Url:</th><td><input type="url" name="url" /></td></tr> <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
4、检查表单数据是否改变
Form.has_changed()
当你需要检查表单的数据是否从初始数据发生改变时,可以使用表单的has_changed() 方法。
>>> data = {'subject': 'hello',
... 'message': 'Hi there',
... 'sender': 'foo@example.com',
... 'cc_myself': True}
>>> f = ContactForm(data, initial=data)
>>> f.has_changed()
False
当提交表单时,我们可以重新构建表单并提供初始值,这样可以实现比较:
>>> f = ContactForm(request.POST, initial=data)
>>> f.has_changed()
5、访问“clean”的数据
From.cleaned_data 表单通过验证后,可以使用cleaned_data属性来访问‘清洁’的数据
这是个非常好用的功能,因为它允许字段以多种方式输入数据,并总能得到一致的输出。
datetime.date 对象,只要它们是合法的。
我们将在这篇文档的后面描述编码的影响。
6、输出表单为HTML
Form.as_p() 将表单渲染成< p >标签
From.as_ul() 将表单渲染成< ul >标签
From.as_table() 将表单渲染成< table > 标签
但是这些都得自己添加<table ></table>;< ul >< /ul >标签
设置表单必填行与错误行的样式
Form.error_css_class
Form.required_css_class
from django import forms class ContactForm(Form): error_css_class = 'error' #错误行样式在HTML中表示class='error' required_css_class = 'required' #必填样式在Html中表示clss=‘required’
然后在css文件中定义error与required类就行了
配置表单元素的HTML id属性,< label >标签
Form.auto_id
>>> f = ContactForm(auto_id=False) #这样在html中表单不包含< label >标签 >>> f = ContactForm(auto_id=True) #在html中表单<label>标签将为每个表单的id >>> f = ContactForm(auto_id='id_for_%s') #在html中表单<label>标签为id_for_字段id
From.prefix 可以为Django表单添加一个命名空间
>>> mother = PersonForm(prefix='mother') >>> father = PersonForm(prefix='father')
Field.required 表示该字段为必填 缺省为必填项,如需要指定不为必须
>>> f=forms.CharField(required=True)
表单中显示时将用到它。
label。
>>> from django import forms >>> class CommentForm(forms.Form): ... name = forms.CharField(label='Your name') ... url = forms.URLField(label='Your Web site', required=False) ... comment = forms.CharField() >>> f = CommentForm(auto_id=False) >>> print(f) <tr><th>Your name:</th><td><input type="text" name="name" /></td></tr> <tr><th>Your Web site:</th><td><input type="url" name="url" /></td></tr> <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>