表单绑定状态
- django继承自Form类的表单有绑定(bound)和未绑定(unbound)状态;
- 如果表单对象在实例化后被赋予数据内容,则表单为绑定状态,具有表单数据验证的功能;
- 未被赋予数据内容,则表单处于unbound状态;
检查表单是否绑定:
>>> f = MomentFrom()>>> print(f.is_bound)False>>> f = MomentFrom({'headline':'hello'})>>> f.is_boundTrue
表单数据验证
字段属性验证
- 例如利用is_valid()函数验证表单是否验证通过,如下,MomentForm初始化只设置了user_name的值,content不为空却没有设置,所以is_valid()的结果为False。
>>>f = MomentForm({"user_name":"zaygee"})>>>f.is_valid()False
- 例如利用is_valid()函数验证表单是否验证通过,如下,MomentForm初始化只设置了user_name的值,content不为空却没有设置,所以is_valid()的结果为False。
自定义逻辑验证
- 也可通过重载Form子类的clean()函数进行自定义,eg: ```python from django.forms import ModelForm, ValidationError from .models import Moment
class MomentFrom(ModelForm): class Meta: model = Moment fields = “all“
def clean(self):"""自定义表单校验,调用Form.is_valid()时被调用"""cleaned_data = super(MomentFrom, self).clean()content = cleaned_data.get("content")if content is None:raise ValidationError("请输入Content内容!")if content.find("ABCD") >= 0:raise ValidationError("不能输入敏感字ABCD!")return cleaned_data
在MomentFrom中增加了clean()函数的定义,该函数在调用Form.is_valid()函数时自动被django调用,如果验证校测失败,则通过抛出validationError()异常结束本次验证。<a name="aPP2Y"></a>### 检查表单变更字段1. 当视图函数收到表单的POST提交,经常需要通过验证用户是否修改了表单数据后进行相应处理,可通过**has_changed()**来判断用户是否修改过表单数据。```pythondef moments_input(request):data = {'content': 'Please input the content','user_name': '匿名','kind': 'python技术'}if request.method == 'POST':form = MomentFrom(request.POST, initial=data)if form.is_valid():moment = form.save()moment.save()return HttpResponseRedirect(reverse('first_url'))if form.has_changed():print("如下字段进行了修改:")for field in form.changed_data:print(field)else:form = MomentFrom()PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))return render(request, os.path.join(PROJECT_ROOT, 'app/templates', 'moments_input.html'), {'form': form})
- request.POST:django从其中解析出用户的输入数据
- initial:Form的初始值,如果initial中的字段值与初始值相比较,有变化则返回True
- 使用changed_data属性定位修改的字段,changed_data是字段名的列表 ```python if form.has_changed(): print(“如下字段进行了修改:”) for field in form.changed_data: print(field)
如下字段进行了修改:
content
```
