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 和原始值 dataf.has_changed() # Falsef = ContactForm(request.POST, initial=data) # 比较传入的POST和原始值 dataf.has_changed() # True
2.4.2. f.changed_data 返回有变化的字段列表
可以用 if … in …
if f.has_changed():f.changed_data
