forms组件的局部钩子与全局钩子的应用
views.py
from blog.Myforms import UserForm #引入即可
Myforms.py
#Author:Kris from django import forms from django.forms import widgets from blog.models import UserInfo from django.core.exceptions import NON_FIELD_ERRORS, ValidationError class UserForm(forms.Form): user=forms.CharField(max_length=32, error_messages={"required": "该字段不能为空"}, label="用户名", widget=widgets.TextInput(attrs={"class":"form-control"},)) pwd = forms.CharField(max_length=32,label="密码", widget=widgets.PasswordInput(attrs={"class":"form-control"},)) re_pwd = forms.CharField(max_length=32,label="确认密码", widget=widgets.PasswordInput(attrs={"class":"form-control"},)) email = forms.EmailField(max_length=32,label="邮箱", widget=widgets.EmailInput(attrs={"class":"form-control"},)) def clean_user(self): user=self.cleaned_data.get("user") UserInfo.objects.filter(username=user).filter() if not user: return user else: raise ValidationError("该用户已注册") def clean(self): #全局钩子 pwd = self.cleaned_data.get("pwd") re_pwd = self.cleaned_data.get("re_pwd") if pwd == re_pwd: return self.cleaned_data else: raise ValidationError("两次密码不一致") #全局错误
register.py
$.ajax({ url:"", type:"post", contentType:false, //要加两个参数不然会报错;数据的编码类型 processData:false, //只要是formdata都要加这两个参数 data: formdata, success: function (data) { console.log(data); if(data.user){ //注册成功 } else{//注册失败 //console.log(data.msg) $("span.error").html(""); //清空错误信息 $(".form-group").removeClass("has-error"); //展示此次提交的错误信息 $.each(data.msg, function(field, error_list){ console.log(field, error_list); if (field == "__all__"){ //处理全局错误信息;下面找到它的标签,父标签给它加上 $("#id_re_pwd").next().html(error_list[0]).parent().addClass("has-error"); } $("#id_"+field).next().html(error_list[0]); //每次循环都把各自的信息放到input那下面了 $("#id_"+field).parent().addClass("has-error"); }) } } }) })