表单绑定状态
- django继承自Form类的表单有绑定(bound)和未绑定(unbound)状态;
- 如果表单对象在实例化后被赋予数据内容,则表单为绑定状态,具有表单数据验证的功能;
- 未被赋予数据内容,则表单处于unbound状态;
检查表单是否绑定:
>>> f = MomentFrom()
>>> print(f.is_bound)
False
>>> f = MomentFrom({'headline':'hello'})
>>> f.is_bound
True
表单数据验证
字段属性验证
- 例如利用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()**来判断用户是否修改过表单数据。
```python
def 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
```