• 基于modelforms组件实现注册功能


    数据库部分

    使用的是auth_user表,添加r_pwd字段后表名变为UserInfo

    from django.db import models
    
    from django.contrib.auth.models import AbstractUser
    
    class UserInfo(AbstractUser):
        r_pwd=models.CharField(max_length=32)

    modelforms 类  需要自己建立,然后需要引

    from django.forms import ModelForm
    from app01.models import UserInfo
    from django.core.exceptions import NON_FIELD_ERRORS, ValidationError #认证错误
    import re
    from django.forms import widgets as wig
    
    class UserModelForm(ModelForm):
        # r_pwd = forms.CharField(min_length=5, widget=widgets.PasswordInput(), label="确认密码")  #外接字段,数据库中没有的字段
        class Meta:
            model=UserInfo
            fields=["username","password","r_pwd","email"]
            labels={
                "username":"用户名",
                "password":"密码",
                "r_pwd":"确认密码",
                "email":"邮箱"
            }
            widgets={
                "password":wig.PasswordInput(attrs={"type":"password"}),
                "r_pwd":wig.PasswordInput(attrs={"type":"password"})
            }
            # error_messages = {
            #     "username":"用户名格式错误",
            #     "password":"密码格式错误",
            # }
            error_messages = {
                'username': {'required': "用户名不能为空", },
                'password': {'required': "密码不能为空", },
            }
    
        # 注册的用户不能和数据库中的重复
        def clean_username(self):
            val=self.cleaned_data.get("username")
            user=UserInfo.objects.filter(username=val)
            if user:
                raise ValidationError("用户已存在")
            else:
                return val
    
        #密码不能纯数字
        def clean_password(self):
            val=self.cleaned_data.get("password")
            if val.isdigit():
                raise ValidationError("密码不能是纯数字")
            else:
                return val
    
        def clean_email(self):
            val=self.cleaned_data.get("email")
            if re.search("w+@qq.com$",val):
                return val
            else:
                raise ValidationError("邮箱必须是qq邮箱")
        def clean(self):
            pwd=self.cleaned_data.get("password")
            r_pwd=self.cleaned_data.get("r_pwd")
    
            if pwd and r_pwd and pwd!=r_pwd:
                raise ValidationError("两次密码不一致")
                # self.add_error("r_pwd",ValidationError("两次密码不一致"))
            else:
                return self.cleaned_data
    
        def __init__(self, *args, **kwargs):#相当于修改forms类的__init__方法
            super().__init__(*args, **kwargs)  #走父类的这个方法
            for filed in self.fields.values():  #循环每个字段对象
                # filed.error_messages={"required":"不能为空"}
                filed.widget.attrs.update({'class': 'form-control'})  #对每个属性添加一个类

    url 配置

    path('reg_modelform/', views.reg_modelform,name='reg_modelform'),#modelform注册

    views配置

    ################################  基于modelforms的注册##########################################################################
    
    from app01.modelforms import UserModelForm
    
    def reg_modelform(request):
    
        if request.method=="GET":
            form=UserModelForm()
            return render(request,'reg_mf.html',locals())
    
        else:
            form = UserModelForm(request.POST)
            print(request.POST)
            response = {"user": None, "err_msg": ""}
            if form.is_valid():
                response["user"]=form.cleaned_data.get("username")
                form.save()
    
            else:
                print(form.errors)
                response['err_msg']=form.errors
            return JsonResponse(response)

    前段页面配置

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登陆页面</title>
        <link rel="stylesheet" href="/static/bootstrap/bootstrap-3.3.7-dist/css/bootstrap.min.css">
        <script type="text/javascript" src="/static/jquery/jquery.3.3.1.js"></script>
        <link rel="stylesheet" href="/static/css/logincss.css">
    </head>
    <body>
    {#    壁纸##############}
        <div class="wraper"></div>
    {############内容#################################}
    
    <div class="container boy">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <form action="" method="post">
                    {% csrf_token %}
    
                    {% for field in form %}
                           <div class="form-group">
                                <label for="">{{ field.label }}</label>
                                {{ field }}
                                <p class="error pull-right">{{ field.errors.0 }}</p>
                            </div>
                    {% endfor %}
    
                    <input type="reset" class="btn btn-primary" value="重置">
                    <input type="button" class="btn btn-primary pull-right reg_btn" value="确认">
                </form>
            </div>
        </div>
    </div>
    <script>
        $('.reg_btn').click(function () {
            $.ajax({
                url:'',
                type:'post',
                data:{
                    user:$("#id_username").val(),   //id_username注意名字别写错了
                    pwd:$("#id_password").val(),
                    r_pwd:$("#id_r_pwd").val(),
                    email:$("#id_email").val(),
                    csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(),
                },
                success:function (response) {
                    if(response.user){
                        {#注册成功#}
                        location.href="/login/";
                    }else{
                        {#清除旧的错误#}
                    $('.error').html("");
                    $(".form-group").removeClass("has-error");
                    {#展示新的错误#}
                    {#循环把错误信息放到相应位置#}
                    $.each(response.err_msg,function (i,j) {
                        console.log(i,j);
                        if (i=="__all__"){  //__all__是第二层校验时产生的全局错误
                            $("#id_r_pwd").next().html(j[0]);
                        }else{
                           $("#id_"+i).next().html(j[0]).css("color","red").parent().addClass("has-error");
                        {#has-error有错误外框显红的效果#}
                        }
                    })
                    }
                }
            })
        })
    </script>
    
    </body>
    </html>
    
    reg_mf.html
  • 相关阅读:
    啊,好久没更新了,今天分享一个小工具,两个方法,转换字节数组成十六进制字符串
    Oracle的关于建表,约束,查询等的练习
    Oracle的完整练习,纯手工打字,可能有一两点错误。。。
    Oracle的用户管理,授权及备份
    Oracle视图,序列及同义词、集合操作
    Oracle的总体回顾
    Oracle表管理
    Oracle基本代码学习
    网上B2C书城,1.0javaWEB版!!好几天没更新了,都忙着做那个网站了~
    Daily Scrum 12.23
  • 原文地址:https://www.cnblogs.com/RootEvils/p/10284700.html
Copyright © 2020-2023  润新知