Django之from表单

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

这里需要注意一点 

  当我们改写的是全局的钩子就需要返回一个全局的钩子 , 我们改写的是局部的钩子  就必须返回一个局部的钩子

原文地址:https://www.cnblogs.com/cuilinpu/p/10321716.html