django自定义form验证error

Django:Form中自定义错误提示信息  

具体讲解可查看:Cleaning a specific field attribute
 
例一:检查特定Field的错误信息,并且在模板中给出提示。
例如在LoginForm表单中,需要检查字段邮箱email是否存在于数据库,可以在 LoginForm 类中定义函数:

class LoginForm(forms.Form):

email = forms.EmailField(error_messages={'required':u'邮箱不能为空','invalid':u'请输入正确的邮箱'})
password = forms.CharField(widget=forms.PasswordInput(),error_messages={'required':u'密码不能为空'})
def clean_email(self):
from users.models import User
data=self.cleaned_data['email']
is_exist=User.objects.filter(email=data).exists()

if not is_exist:
raise forms.ValidationError(u"这个邮箱还没有注册哦,请注册后再登录!")
return data

模板错误提示对应的变量:{{form.email.errors}}

<div><label for="id_email">邮箱</label><span style="margin-left:10px">{{ form.email }}{{form.email.errors}}</span></div>

 
例二:同时检查多个字段,并且在模板中给出提示。在LoginForm表单中增加clean()函数即可

def clean(self):
from users.models import User
cleaned_data=self.cleaned_data
data_email=cleaned_data.get("email")
data_password=cleaned_data.get("password")
if data_password:
is_exist=User.objects.filter(email=data_email,password=data_password).exists()
if not is_exist:
raise forms.ValidationError(u"密码错误!")
return cleaned_data

模板错误提示 对应的变量 :{{form.non_field_errors}}
 
特别注意:clean函数是在调用form.is_valid()后默认自动执行的函数,因此,在执行后return回的值特别重要。一般而言,要向获得所有值, return cleaned_data是必须的。 return data_email,data_password则会返回这两个值,此时,在views.py函数中调用is_valid()函数后,则只能得到一个列表,包含两个值,而非cleaned_data字典了
 
例三:修改密码功能中,在form.py中获取当前用户id,检测该用户的输入的密码是否与真实密码一致
form.py,PasswordForm,通过一个隐藏的类型uid用来存放当前用户id

class PasswordForm(forms.Form):
uid= forms.CharField(widget=forms.HiddenInput()) #隐藏的类型,用来获取当前用户id
oldpsw = forms.CharField(widget=forms.PasswordInput(),error_messages={'required':u'旧密码不能为空'})
newpsw1 = forms.CharField(widget=forms.PasswordInput(),error_messages={'required':u'新密码不能为空'})
newpsw2 = forms.CharField(widget=forms.PasswordInput(),error_messages={'required':u'密码不能为空'})

def clean(self):
from users.models import User

oldpassword=self.cleaned_data.get('oldpsw')
newpassword1=self.cleaned_data.get('newpsw1')
newpassword2=self.cleaned_data.get('newpsw2')
uid=self.cleaned_data.get('uid')
realpsw=User.objects.get(id=uid).password #通过获取的
if realpsw==oldpassword:
if newpassword1!=newpassword2:
raise forms.ValidationError(u'新密码两次输入不一样,请重新输入')
else:
raise forms.ValidationError(u'旧密码错误,请重新输入')
return self.cleaned_data

模板中对应的自定义uid类型,以获取渲染该模板时得到的id值:

<input type="hidden" name="uid" value="{{id}}" /> 这里特别注意name要与PasswordForm定义的名字一致

posted @ 2018-03-16 18:21  诛仙物语  阅读(274)  评论(0编辑  收藏  举报