1. 实例化表单 及 绑定数据
方式 | 代码示例 |
---|---|
实例化表单类 | f = ContactForm() |
绑定数据(POST) | f = ContactForm(request.POST) |
绑定数据(字典) | data = {'subject':'hello','message':'hi'} f = ContactForm(data) |
上传文件 | f = ContactForm(request.POST, request.FILES) 而且,表单必须有 enctype=”multipart/form-data” <form enctype="multipart/form-data" method="post" action="/foo/"> |
2. 方法和属性
2.1. 【速查】
API | 描述 |
---|---|
绑定数据 | - |
f.is_bound | 是否绑定数据 |
校验数据 | - |
f.clean() | 验证数据,需要传入一个参数 |
f.cleaned_data | 表单是否合法 |
f.errors | 错误信息字典 |
f.errors.as_data() | 将字段映射到原始 ValidationError 实例 |
f.errors.as_json() | 返回JSON序列化后的错误信息字典 |
f.add_error(FieldName, error) | 特定字段添加错误信息 |
f.non_field_errors() | 返回非字段错误 |
f.has_error(FieldName, code) | 判断字段是否有指定code的错误 |
检查数据变动 | - |
f.has_changed() | 检查数据是否发生变化 |
f.changed_data | 返回有变化的字段列表 |
2.2. 数据绑定相关
2.2.1. f.is_bound
是否绑定数据
f = ContactForm({})
f.is_bound # True
注意:
- 空数据也是绑定
- 如果想修改 Form 实例数据需要另外创建新的 Form 实例,本身不可变
2.3. 校验数据
2.3.1. f.clean()
验证数据
需要传入一个参数
f = forms.EmailField()
f.clean('foo@example.com') # 正确返回本身
f.clean('invalid email address') # 错误返回 ValidationError
多用于开发、测试过程中对数据进行验证和测试
注意:如果自定义验证,需要重新实现 clean()
2.3.2. f.cleaned_data
表单是否合法
返回通过表单验证的字段字典
{
'message': 'Hi there',
'subject': 'hello'
}
# 使用其中的数据
f.cleaned_data.get('message')
2.3.3. f.errors
错误信息字典
{
'sender': ['Enter a valid email address.'],
'subject': ['This field is required.']
}
2.3.4. f.errors.as_data()
将字段映射到原始 ValidationError 实例
{
'sender': [ValidationError(['Enter a valid email address.'])],
'subject': [ValidationError(['This field is required.'])]
}
2.3.5. f.errors.as_json()
返回JSON序列化后的错误信息字典
{
"sender": [{"message": "Enter a valid email address.", "code": "invalid"}],
"subject": [{"message": "This field is required.", "code": "required"}]
}
2.3.6. f.add_error(FieldName, error)
特定字段添加错误信息
如果 FieldName 设为 None,error 将显示在 {{ form.non_field_errors }}
2.3.7. f.has_error(FieldName, code) 判断字段是否有指定code的错误
如果 code 设为 None,字段有任何错误出现也返回 True
2.4. 检查数据变化
2.4.1. f.has_changed()
检查数据是否发生变化
data = {
'subject': 'hello',
'message': 'Hi there',
'sender': 'foo@example.com',
'cc_myself': True
}
f = ContactForm(data, initial=data) # 比较传入的 data 和原始值 data
f.has_changed() # False
f = ContactForm(request.POST, initial=data) # 比较传入的POST和原始值 data
f.has_changed() # True
2.4.2. f.changed_data
返回有变化的字段列表
可以用 if … in …
if f.has_changed():
f.changed_data