表单绑定状态

  1. django继承自Form类的表单有绑定(bound)和未绑定(unbound)状态;
  2. 如果表单对象在实例化后被赋予数据内容,则表单为绑定状态,具有表单数据验证的功能;
  3. 未被赋予数据内容,则表单处于unbound状态;
  4. 检查表单是否绑定:

    1. >>> f = MomentFrom()
    2. >>> print(f.is_bound)
    3. False
    4. >>> f = MomentFrom({'headline':'hello'})
    5. >>> f.is_bound
    6. True

    表单数据验证

  5. 字段属性验证

    1. 例如利用is_valid()函数验证表单是否验证通过,如下,MomentForm初始化只设置了user_name的值,content不为空却没有设置,所以is_valid()的结果为False。
      1. >>>f = MomentForm({"user_name":"zaygee"})
      2. >>>f.is_valid()
      3. False
  6. 自定义逻辑验证

    1. 也可通过重载Form子类的clean()函数进行自定义,eg: ```python from django.forms import ModelForm, ValidationError from .models import Moment

class MomentFrom(ModelForm): class Meta: model = Moment fields = “all

  1. def clean(self):
  2. """自定义表单校验,
  3. 调用Form.is_valid()时被调用"""
  4. cleaned_data = super(MomentFrom, self).clean()
  5. content = cleaned_data.get("content")
  6. if content is None:
  7. raise ValidationError("请输入Content内容!")
  8. if content.find("ABCD") >= 0:
  9. raise ValidationError("不能输入敏感字ABCD!")
  10. return cleaned_data
  1. MomentFrom中增加了clean()函数的定义,该函数在调用Form.is_valid()函数时自动被django调用,如果验证校测失败,则通过抛出validationError()异常结束本次验证。
  2. <a name="aPP2Y"></a>
  3. ### 检查表单变更字段
  4. 1. 当视图函数收到表单的POST提交,经常需要通过验证用户是否修改了表单数据后进行相应处理,可通过**has_changed()**来判断用户是否修改过表单数据。
  5. ```python
  6. def moments_input(request):
  7. data = {
  8. 'content': 'Please input the content',
  9. 'user_name': '匿名',
  10. 'kind': 'python技术'
  11. }
  12. if request.method == 'POST':
  13. form = MomentFrom(request.POST, initial=data)
  14. if form.is_valid():
  15. moment = form.save()
  16. moment.save()
  17. return HttpResponseRedirect(reverse('first_url'))
  18. if form.has_changed():
  19. print("如下字段进行了修改:")
  20. for field in form.changed_data:
  21. print(field)
  22. else:
  23. form = MomentFrom()
  24. PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  25. return render(request, os.path.join(PROJECT_ROOT, 'app/templates', 'moments_input.html'), {'form': form})
  • request.POST:django从其中解析出用户的输入数据
  • initial:Form的初始值,如果initial中的字段值与初始值相比较,有变化则返回True
    1. 使用changed_data属性定位修改的字段,changed_data是字段名的列表 ```python if form.has_changed(): print(“如下字段进行了修改:”) for field in form.changed_data: print(field)

如下字段进行了修改:

content

```