from django import forms
from django.forms import widgets
from app01 import models
from django.core.exceptions import ValidationError
#校验模板,对着这个进行校验
class RegForm(forms.Form):
name = forms.CharField(max_length=8, min_length=3, label='用户名',
error_messages={'max_length': '太长了',
'min_length': '太短了',
'required': '该项不能为空'
},
widget=widgets.TextInput(attrs={'class': 'form-control'})
)
pwd = forms.CharField(max_length=8, min_length=3, label='密码',
error_messages={'max_length': '太长了',
'min_length': '太短了',
'required': '该项不能为空'
},
widget=widgets.PasswordInput(attrs={'class': 'form-control'})
)
re_pwd = forms.CharField(max_length=8, min_length=3, label='确认密码',
error_messages={'max_length': '太长了',
'min_length': '太短了',
'required': '该项不能为空'
},
widget=widgets.PasswordInput(attrs={'class': 'form-control'})
)
email = forms.EmailField(label='邮箱', error_messages={'invalid': '格式不正确',
'required': '该项不能为空'
},
widget=widgets.EmailInput(attrs={'class': 'form-control'})
)
# clean_字段名字
def clean_name(self):
# 从cleaned_data中取出字段的值
name = self.cleaned_data.get('name')
# # 校验是否以sb开头
if name.startswith('sb'):
raise ValidationError('不能以sb开头')
else:
return name
# user = models.UserInfo.objects.filter(name=name).first()
# if user:
# # 用户已经存在,校验不通过,抛一个异常
# raise ValidationError('该用户已经存在')
#
# else:
# # 校验通过,返回要校验的数据
# return name
# def clean_pwd(self):
# pass
# 全局钩子函数(上面所有校验规则都通过了,包括自定义的)在执行这个
def clean(self):
pwd=self.cleaned_data.get('pwd')
re_pwd=self.cleaned_data.get('re_pwd')
if pwd==re_pwd:
# 正确,返回self.cleaned_data
return None
else:
# 校验失败,抛异常
raise ValidationError('两次密码不一致')
-forms组件的渲染错误信息
在模板中: < span > {{foo.errors.0}} < / span >
-forms使用bootstrap样式# 必须先导入模块 from django.forms import widgets
widget = widgets.EmailInput(attrs={'class': 'form-control'}))
-全局和局部钩子函数: AOP:面向切面编程 - 局部钩子函数(再校验name)
def clean_name(self):
从cleaned_data中取出字段的值
name = self.cleaned_data.get('name')
# 校验是否以sb开头
if name.startswith('sb'):
raise ValidationError('不能以sb开头')
else: return name - 全局钩子函数
def clean(self):
pwd = self.cleaned_data.get('pwd')
re_pwd = self.cleaned_data.get('re_pwd')
if pwd == re_pwd: # 正确,返回self.cleaned_data
return self.cleaned_data
else:
校验失败, 抛异常
aise
ValidationError('两次密码不一致')