数据库部分

使用的是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

基于modelforms组件实现注册功能的更多相关文章

  1. day 77 基于form组件的注册功能

    Form 表单 py文件 from django import forms #定义一个form类注册用 class RegForm (forms.Form): username =forms.Char ...

  2. Django基于form组件实现注册校验

    一 基本流程 1 创建form组件对应的类,比如LoginForm 2 前端的三种渲染方式: 渲染方式三种: 1 <form action="" novalidate met ...

  3. django项目基于钩子验证的注册功能

    前端html <div class="agile-row"> <h3>注册</h3> {# 注册的开始#} <div class=&quo ...

  4. 3- 功能2:基于forms组件和ajax实现注册功能

    1.forms组件的注册页面 url from django.urls import path, re_path from blog import views from django.views.st ...

  5. 基于forms组件和Ajax实现注册功能

    一.基于forms组件的注册页面设计 1.运用forms组件的校验字段功能实现用户注册 views.py:    (在钩子中代码解耦,将form放在cnblog/blog/Myforms.py中) f ...

  6. 2.1博客系统 |基于form组件和Ajax实现注册登录

    基于forms组件和Ajax实现注册功能 1 基于forms组件设计注册页面 --点击头像 === 点击input --头像预览: 修改用户选中的文件对象:获取文件对象的路径:修改img的src属性, ...

  7. BBS-基于forms组件和ajax实现注册功能

    http://www.cnblogs.com/yuanchenqi/articles/7638956.html 1.设计注册页面 views.py from django import forms c ...

  8. 基于struts2和hibernate的登录和注册功能——完整实例

    1.该项目使用MySQL数据库,数据库名为test,表名info,如图所示: 2.配置web.xml(Struts2使用) <?xml version="1.0" encod ...

  9. 基于vue开发的多功能的时间选择器组件,开箱即用

    好一段时间没有写过博客了,在国庆期间心血来潮优化了一个组件,在日常开发中时常会有需求用到时间选择器,不同的项目需求可能会不一样.近期开发的几个项目中就有需求用到这样的选择器,由于以前有用到相关的组件, ...

随机推荐

  1. Apache与Tomcat联系及区别??

    Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行.Apache是Web服务器而Tomcat是Java应用服务器. A ...

  2. mysql之sql性能调优

    sql调优大致分为两步:1 如何定位慢查询   2 如何优化sql语句. 一:定位慢查询 -- 显示到mysql数据库的连接数 -- show status like 'connections'; - ...

  3. 3.17内存,进程,rpm和yum,python编译安装

    一.内存 前面说过内存有寄存器.高速缓存和内存条 但在实际情况中有些文件比较大,内存不足以读取其内容,并且大部分内容不是被立即使用,所以有了交换分区,即用硬盘空间临时存储相关部分,当作缓存,这部分就是 ...

  4. Shell编程变量

    shell变量 什么是变量,存放了各种数据,在linux怎么定义了变量,name=ken,name就是变量名,ken就是变量值, 但是在shell中,有三种方式: name=ken name='ken ...

  5. 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)

    链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  6. 表达式,数据类型和变量(Expressions,Data Types & Variables)

    (一)表达式: 1)4+4就是表达式,它是程序中最基本的编程指令:表达式包含一个值(4)和操作符号(+),然后就会计算出一个单独的值; 2)一个单独的值没有包含操作符号也可以叫表达式,尽管它只计算它本 ...

  7. 2--面试总结-深入理解js线程进阶-宏任务微任务

    前言:Event Loop即时间循环,是指浏览器或Node的一种解决javascript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理 Js运行机制      1.不同运行环境,js运行 ...

  8. Vscode中解决Html文件中不能打断点问题

    Vscode中解决Html文件中不能打断点问题: 默认情况下,VSCode是不能在Html文件里打断点的,但是可以修改设置,依次打开:文件->首选项->设置,然后功能->调试-> ...

  9. git概述(三)

    Bug分支: 当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交: 并不是你不想提交,而是工作只进行 ...

  10. Git版本控制工具初识

    Git使用教程 0 Git下载安装 下载网址:https://www.git-scm.com/download/ 安装时,一路next就可以了,如果遇到下载很慢时,可以选择换个浏览器试试,实在不行就找 ...