from表单是自带校验宫能的 可以省区我们很多麻烦 现在我们来看下他的用法
1 # 注册的视图函数 2 def register(request): 3 if request.method == "POST": 4 # 这里写个一字典用来和前端的ajax进行交互 5 ret = {"status": 0, "msg": ""} 6 # 生成一个from对象 7 form_obj = forms.RegForm (request.POST) 8 # 校验用户输入 9 if form_obj.is_valid (): 10 ret["msg"] = "/index/" 11 # 删掉确认密码的字段 12 form_obj.cleaned_data.pop ("re_password") 13 # 取到用户传过来的头像 14 avatar = request.FILES.get ("avatar") 15 # 传入数据库 16 # print(form_obj.cleaned_data["username"]) 17 models.UserInfo.objects.create_user (**form_obj.cleaned_data, avatar=avatar) 18 19 else: 20 ret["status"] = 1 21 ret["msg"] = form_obj.errors 22 return JsonResponse (ret) 23 # 生成一个form对象 24 form_obj = forms.RegForm () 25 return render (request, "register.html", {"form_obj": form_obj})
如上
form_obj.is_valid () 是django为我们提供用于校验的方法 , 我们只需要把校验通过的直接做我们需要做的处理就好了
如果有用户输入的不符合规范 Django会帮我们把报错信息放在form_obj.errors 这个方法里边
这里我们把错误信息做成了一个字典发到了前端 接下来我们看下前端的写法
1 // 这里是用ajxj提交表单的操作 2 $("#reg-submit").click(function () { 3 //var username = $("#id_username").val(); 4 //var password = $("#id_password").val(); 5 //var re_password = $("#id_re_password").val(); 6 //var email = $("#id_email").val(); 7 var formData = new FormData(); 8 formData.append("username",$("#id_username").val()); 9 formData.append("password",$("#id_password").val()); 10 formData.append("re_password",$("#id_re_password").val()); 11 formData.append("email",$("#id_email").val()); 12 formData.append("avatar",$("#id_avatar")[0].files[0]); 13 $.ajax({ 14 url:"/reg/", 15 type:"post", 16 processData:false, 17 contentType:false, 18 //data:{"username":username,"password":password,"re_password":re_password,"email":email}, 19 data:formData, 20 success:function (data) { 21 if (data.status) { 22 // 后端发来的是报错信息 这里写一个循环取到这些报错 23 $.each(data.msg,function (k,v) { 24 // 把获取到的报错信息填写到表单下边的span标签 这里做一个字符串的拼接取到对应的标签 25 $("#id_"+k).next("span").text(v).parent().addClass("has-error") 26 }) 27 }else { 28 // 没有错误就跳转到指定页面 29 location.href = data.msg; 30 } 31 32 } 33 }) 34 });
这样我们就可以在用户输入不合法的时候可以给到提示了 下面是 我们创建发form类 和 检验 用户名 和 密码的 方法
1 from django import forms 2 from django.core.exceptions import ValidationError 3 from blog import models 4 5 # 定义一个注册的form类 6 class RegForm(forms.Form): 7 username = forms.CharField( 8 max_length=16, 9 label="用户名", 10 error_messages={ 11 "max_length": "用户名最长16位", 12 "required": "用户名不能为空", 13 }, 14 widget=forms.widgets.TextInput( 15 attrs={"class": "form-control"}, 16 ) 17 ) 18 19 password = forms.CharField( 20 min_length=6, 21 label="密码", 22 widget=forms.widgets.PasswordInput( 23 attrs={"class": "form-control"}, 24 render_value=True, 25 ), 26 error_messages={ 27 "min_length": "密码至少要6位!", 28 "required": "密码不能为空", 29 } 30 ) 31 32 re_password = forms.CharField( 33 min_length=6, 34 label="确认密码", 35 widget=forms.widgets.PasswordInput( 36 attrs={"class": "form-control"}, 37 render_value=True, 38 ), 39 error_messages={ 40 "min_length": "确认密码至少要6位!", 41 "required": "确认密码不能为空", 42 } 43 ) 44 45 email = forms.EmailField( 46 label="邮箱", 47 widget=forms.widgets.EmailInput( 48 attrs={"class": "form-control"}, 49 50 ), 51 error_messages={ 52 "invalid": "邮箱格式不正确!", 53 "required": "邮箱不能为空", 54 } 55 ) 56 57 58 # # 重写全局的钩子函数,对确认密码做校验 59 def clean(self): 60 password = self.cleaned_data.get("password") 61 re_password = self.cleaned_data.get("re_password") 62 63 if re_password and re_password != password: 64 self.add_error("re_password", ValidationError("两次密码不一致")) 65 66 else: 67 return self.cleaned_data 68 69 # 写一个局部的钩子函数 校验用户名是否被注册 70 def clean_username(self): 71 username = self.cleaned_data.get("username") 72 is_enroll = models.UserInfo.objects.filter(username=username) 73 if is_enroll: 74 self.add_error("username",ValidationError("该用户已经被注册!")) 75 return username
这里需要注意一点
当我们改写的是全局的钩子就需要返回一个全局的钩子 , 我们改写的是局部的钩子 就必须返回一个局部的钩子