• 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

    这里需要注意一点 

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

  • 相关阅读:
    win10自动休眠解决方法
    创世纪游戏、黄金分割比
    placeholder和assign速度对比
    内耗
    windows下编写dll
    北航院系和数字的对应关系
    maven Could not resolve dependencies
    java9模块不可见问题
    maven-dependencies插件的模拟实现
    Freemarker简单封装
  • 原文地址:https://www.cnblogs.com/cuilinpu/p/10321716.html
Copyright © 2020-2023  润新知