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)
Field.label

表单中显示时将用到它。

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>
View Code

相关文章:

  • 2022-12-23
  • 2021-12-13
  • 2021-07-11
  • 2021-08-01
  • 2021-10-12
猜你喜欢
  • 2021-09-16
  • 2022-12-23
  • 2022-12-23
  • 2022-01-06
  • 2021-08-09
  • 2021-05-21
  • 2021-12-16
相关资源
相似解决方案