Ⅰ 局部钩子的使用
- 在自定义的Form类中写 clean_字段名
- 取出字段的真正值
- 做复杂判断
- 如果判断失败,抛出ValidationError
- 如果通过,return 判断的字段
- 判断用户名是否以字母开头,且只能是数字字母和下划线
from django.forms import widgets,ValidationError
def clean_name(self):
name = self.cleaned_data.get('name')
if re.search('^[a-zA-Z][a-zA-Z0-9_]{2,15}$',name):
return name
else:
raise ValidationError('请以字母开头,且只能是数字字母和下划线组成!')
Ⅱ 全局钩子的使用
- 使用方式同局部
- 定义直接是clean(self)
def clean(self):
password1 = self.cleaned_data.get('password1')
password2 = self.cleaned_data.get('password2')
if password2 == password1:
return self.cleaned_data
else:
raise ValidationError('两次密码不一致,请确认!')
- 返回的数据不会直接渲染到html页面
- 需要我们取出来传送到前端然后渲染
- 校验失败后的代码
- 做了判断,因为刚打开页面时没有数据,也会渲染出来none
if form.is_valid():
# 校验成功代码
return HttpResponse('注册成功')
else:
err = form.errors.get('__all__') # 取出全局钩子返回的错误信息
if err:
return render(request,'registered.html',{'form':form,'err':err})
else:
return render(request,'registered.html',{'form':form})
- html渲染全局钩子错误信息
- 因为这个html页面是纯手动的,用半自动的就不用加上面的判断了
<span class="text-danger pull-right">{{ err }}</span>