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 是否绑定数据

  1. f = ContactForm({})
  2. f.is_bound # True

注意:

  1. 空数据也是绑定
  2. 如果想修改 Form 实例数据需要另外创建新的 Form 实例,本身不可变

2.3. 校验数据

2.3.1. f.clean() 验证数据

需要传入一个参数

  1. f = forms.EmailField()
  2. f.clean('foo@example.com') # 正确返回本身
  3. f.clean('invalid email address') # 错误返回 ValidationError

多用于开发、测试过程中对数据进行验证和测试

注意:如果自定义验证,需要重新实现 clean()

2.3.2. f.cleaned_data 表单是否合法

返回通过表单验证的字段字典

  1. {
  2. 'message': 'Hi there',
  3. 'subject': 'hello'
  4. }
  5. # 使用其中的数据
  6. f.cleaned_data.get('message')

2.3.3. f.errors 错误信息字典

  1. {
  2. 'sender': ['Enter a valid email address.'],
  3. 'subject': ['This field is required.']
  4. }

2.3.4. f.errors.as_data() 将字段映射到原始 ValidationError 实例

  1. {
  2. 'sender': [ValidationError(['Enter a valid email address.'])],
  3. 'subject': [ValidationError(['This field is required.'])]
  4. }

2.3.5. f.errors.as_json() 返回JSON序列化后的错误信息字典

  1. {
  2. "sender": [{"message": "Enter a valid email address.", "code": "invalid"}],
  3. "subject": [{"message": "This field is required.", "code": "required"}]
  4. }

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() 检查数据是否发生变化

  1. data = {
  2. 'subject': 'hello',
  3. 'message': 'Hi there',
  4. 'sender': 'foo@example.com',
  5. 'cc_myself': True
  6. }
  7. f = ContactForm(data, initial=data) # 比较传入的 data 和原始值 data
  8. f.has_changed() # False
  9. f = ContactForm(request.POST, initial=data) # 比较传入的POST和原始值 data
  10. f.has_changed() # True

2.4.2. f.changed_data 返回有变化的字段列表

可以用 if … in …

  1. if f.has_changed():
  2. f.changed_data