基于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

 

转载于:https://www.cnblogs.com/RootEvils/p/10284700.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值