Django项目:CRM(客户关系管理系统)--51--42PerfectCRM实现AJAX全局账号注册

#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path # ————————02PerfectCRM创建ADMIN页面————————
from django.conf.urls import url # URL
from django.conf.urls import include # 分发URL
# ————————02PerfectCRM创建ADMIN页面———————— urlpatterns = [
path('admin/', admin.site.urls), # ————————02PerfectCRM创建ADMIN页面————————
url(r'^king_admin/', include("king_admin.king_urls")), # 自定义admin
# ————————02PerfectCRM创建ADMIN页面———————— # ————————03PerfectCRM创建基本数据————————
url(r'^DBadd/', include("DBadd.DBadd_urls")), # 添加随机数据
# ————————03PerfectCRM创建基本数据————————
# ————————38PerfectCRM实现全局账号登录注销————————
url(r'^gbacc/', include("gbacc.gbacc_urls")), # 全局账号登录注销
# ————————38PerfectCRM实现全局账号登录注销———————— # ————————42PerfectCRM实现AJAX全局账号注册————————
url(r'^gbacc/', include("gbacc.gbacc_ajax_urls")), # 全局账号登录注销
# ————————42PerfectCRM实现AJAX全局账号注册———————— ]
#urls.py

# gbacc_ajax_urls.py # ————————42PerfectCRM实现AJAX全局账号注册————————
from django.conf.urls import url
from gbacc import gbacc_ajax_views
urlpatterns = [
url(r'^gbacc_ajax_register/', gbacc_ajax_views.gbacc_ajax_register, name='gbacc_ajax_register'), # ajax注册
]
# ————————42PerfectCRM实现AJAX全局账号注册————————
# gbacc_ajax_urls.py


# gbacc_ajax_views.py
# ————————42PerfectCRM实现AJAX全局账号注册————————
from django.shortcuts import render #页面返回
#验证码函数 #处理注册的内容
from io import BytesIO #创建内存空间
from django.shortcuts import HttpResponse #页面返回
from gbacc.gbacc_auxiliary.check_code import create_validate_code #验证图片
def check_code(request):
stream = BytesIO()#创建内存空间
img, code = create_validate_code()#调用验证码图片生成函数 返回图片 和 对应的验证码
img.save(stream, 'PNG')#保存为PNG格式
request.session['CheckCode'] = code#保存在session中
return HttpResponse(stream.getvalue())
# json 对错误信息对象进行处理 #处理注册的内容
import json # 转为json格式
from django.core.exceptions import ValidationError # 错误信息
class JsonCustomEncoder(json.JSONEncoder):
def default(self, field):
if isinstance(field, ValidationError): # 如果是错误信息进行处理
return {'code': field.code, 'messages': field.messages}
else:
return json.JSONEncoder.default(self, field)
# AJAX注册
from gbacc.gbacc_auxiliary.account import RegisterForm # 注册验证
from django.contrib.auth.hashers import make_password # 密码加密
from crm import models #数据库
def gbacc_ajax_register(request):
if request.method=='GET':
obj=RegisterForm(request=request, data=request.POST) #注册验证 #PerfectCRM.gbacc_auxiliary.account
return render(request, 'gbacc_ajax/gbacc_ajax_register.html',{'obj':obj})
elif request.method=='POST':
#返回的字符串 字典
ret={'status':False,'error':None,'data':None}
#进行验证 调用RegisterForm
obj=RegisterForm(request=request, data=request.POST)#注册验证 #PerfectCRM.gbacc_auxiliary.account
if obj.is_valid():
name = obj.cleaned_data.get('name')#获取用户名
pwd = obj.cleaned_data.get('password') #获取密码
email= obj.cleaned_data.get('email') #获取邮箱账号
password=make_password(pwd,)#密码加密
#print(username,password,email)
#——————数据库添加数据——————
models.UserProfile.objects.create(name=name,password=password,email=email,)
#——————数据库添加数据—————— #——————获取用户数据,放进个人主页——————
# user_info= models.UserProfile.objects. \
# filter(email=email, password=password). \
# values('id', 'name', 'email',).first()
# #nid=user_info.id
# print(user_info,type(user_info),'..........')
# admin_obj = base_admin.site.registered_sites['crm']['userprofile']#表类
# user_obj=admin_obj.model.objects.get(id=user_info['id'])#类表的对象
# user_obj.set_password(password)#加密
# user_obj.save()
# request.session['user_info'] = user_info # session
#print(user_info.id)
#——————获取用户数据,放进个人主页——————
#——————AJAX if (arg.status) { #状态——————
ret['status']=True #状态
ret['data']=obj.cleaned_data
# print(obj.cleaned_data)
# print(ret)
#对错误信息对象进行转化处理 前端不用二次序列化
ret=json.dumps(ret)#转为json格式
#return HttpResponse(ret)
#——————AJAX if (arg.status) { #状态——————
else:
#加入错误信息
#print(obj.errors)
ret['error']=obj.errors.as_data()
#提示为False
#ret['status']=False
#对错误信息对象进行转化处理 前端不用二次序列化
ret=json.dumps(ret,cls=JsonCustomEncoder) #转为json格式
#print(ret)
return HttpResponse(ret)
# ————————42PerfectCRM实现AJAX全局账号注册————————
# gbacc_ajax_views.py

# account.py
# ————————40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息————————
from .base import BaseForm #重写
from django.core.exceptions import ValidationError #错误信息
from django import forms as django_forms # forms
from django.forms import fields as django_fields #字段
from crm import models #数据库
#注册验证
class RegisterForm(BaseForm, django_forms.Form):
name=django_fields.CharField(
min_length=3,
max_length=20,
error_messages={'required': '用户名不能为空.', #默认输入这个
'min_length': "用户名长度不能小于3个字符",
'max_length': "用户名长度不能大于32个字符"}, )
email=django_fields.EmailField(
error_messages={'required': '邮箱不能为空.','invalid':"邮箱格式错误"}, )
password = django_fields.RegexField(
#正则表达 配置密码复杂度
# '^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$\%\^\&\*\(\)])[0-9a-zA-Z!@#$\%\^\&\*\(\)]{8,32}$',
'',
min_length=6,
max_length=32,
error_messages={'required': '密码不能为空.', #默认输入这个
'invalid': '密码必须包含数字,字母、特殊字符', # 正则表达
'min_length': "密码长度不能小于6个字符",
'max_length': "密码长度不能大于32个字符",
'message':None}, )
confirm_password=django_fields.CharField(
error_messages={'required': '确认密码不能为空.',
'invalid': '确认密码不对', }, )
check_code = django_fields.CharField(
error_messages={'required': '验证码不能为空.'}, ) #内置勾子
#用户名重复查询
def clean_username(self):
#查询是否存在
name=self.cleaned_data['name'] #cleaned_data 就是读取表单返回的值,返回类型为字典dict型
u =models.UserProfile.objects.filter(name=name).count() #查询数据库
if not u:
return self.cleaned_data['name']
else:
raise ValidationError(message='用户名已经存在',code='invalid')
#邮箱重复查询
def clean_email(self):
email=self.cleaned_data['email']
e=models.UserProfile.objects.filter(email=email).count() #查询数据库
if not e:
return self.cleaned_data['email']
else:
raise ValidationError('邮箱已经被注册!',code='invalid') #确认密码
def clean_confirm_password(self):
pwd1=self.request.POST.get('password') #通过POST 获取前端 输入的值
pwd2=self.cleaned_data['confirm_password'] #name="confirm_password"
if pwd1 != pwd2:
raise ValidationError('二次输入密码不匹配')
else:
return self.cleaned_data['confirm_password'] # ————————42PerfectCRM实现AJAX全局账号注册————————
# ————————AJAX调用————————
# 验证码 校对
def clean_check_code(self):
#调用check_code.py # 获取生成的验证码 #获取输入的验证码
if self.request.session.get('CheckCode').upper() != self.request.POST.get('check_code').upper():
raise ValidationError(message='验证码错误', code='invalid')
else:
return self.cleaned_data['check_code']
# ————————AJAX调用————————
# ————————42PerfectCRM实现AJAX全局账号注册————————
# ————————40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息————————
# account.py




{#global_ajax_register.html#}
{## ————————42PerfectCRM实现AJAX全局账号注册————————#}
{% extends "gbacc_master/gbacc_sample.html" %}
{% block right-container-content %}
<h1 class="form-group col-lg-offset-3"> AJAX用户注册</h1>
<form class="form-horizontal" role="form" method="POST" id="fm"
action="/gbacc_ajax/gbacc_ajax_register.html"> {% csrf_token %}
<div class="col-lg-offset-3">
<div class="form-inline form-group">
<label class="col-sm-1 " for="email">邮箱账号</label>
<input class="form-control" type="email" id="email" name="email" placeholder="请输入邮箱">
<span class=" alert-danger hide"><span id="spemail"></span> {# ajax 验证#}</span></div>
<div class="form-inline form-group">
<label class="col-sm-1 " for="username">用户名</label>
<input class="form-control" type="text" id="username" name="name" placeholder="请输入用户名">
<span class=" alert-danger hide"><span id="spuser"></span> {# ajax 验证#}</span></div>
<div class="form-inline form-group">
<label class="col-sm-1 " for="password">密码</label>
<input class="form-control" type="password" id="password" name="password"
placeholder="请输入密码">{{ obj.errors.pwd }}
<span class=" alert-danger hide"><span id="sppwd"></span> {# ajax 验证#}</span> </div>
<div class="form-inline form-group">
<label class="col-sm-1 " for="confirm_password">确认密码</label>
<input class="form-control" type="password" id="confirm_password" name="confirm_password"
placeholder="请重新输入密码">{{ obj.errors.cnpwd }}
<span class=" alert-danger hide"><span id="spcnpwd"> </span> {# ajax 验证#}</span></div>
<div class="form-inline form-group">
<label class="col-sm-1 " for="text">验证码</label>
<input type="text" class="form-control" id="check_code" name="check_code"
placeholder="请输入验证码">{{ obj.errors.pwds }}
<img id="check_code_img" src="/gbacc/check_code.html/" onclick="changeCheckCode(this);">
{## 配置URL绝对路径#}{## 绑定JS刷新验证码图片#}
<span class=" alert-danger hide"><span id="error_msg"></span></span></div>
<div class="form-inline form-group">
<div class="col-xs-2">
<a class="btn btn-lg btn-primary btn-block" href="/gbacc/gbacc_login/">登陆</a></div>
<div class="col-xs-2">
<a class="btn btn-lg btn-primary btn-block" id="submit">注册</a></div>
</div>
</div>
</form>
{% endblock %}
{% block js %}{#自定义内容开始 body#}
<script>
$(function () { //页面加载完自动执行函数
register();
});
function register() {
$('#submit').click(function () {
var $msg = $('#error_msg');//用来验证码错误 提示
var spuser = $('#spuser');//用户
var spemail = $('#spemail');//邮箱
var sppwd = $('#sppwd');//密码
var spcnpwd = $('#spcnpwd');//确认密码
$msg.parent().addClass('hide');//初始为隐藏提示标签 验证码
spuser.parent().addClass('hide'); //初始为隐藏提示标签 用户
spemail.parent().addClass('hide');//初始为隐藏提示标签 邮箱
sppwd.parent().addClass('hide'); //初始为隐藏提示标签 密码
spcnpwd.parent().addClass('hide'); //初始为隐藏提示标签 确认密码
$.ajax({
url: '/gbacc/gbacc_ajax_register/', //绑定验证的页面
type: 'POST',
data: $('#fm').serialize(),//表单所有内容
dataType: 'JSON',
success: function (arg) {
//alert(arg.status);
console.log(arg);
if (arg.status) {
alert('注册成功');
location.href = '/';//跳 转到 主页
} else {
//判断是否有这个错误信息
if (arg.error.name != null) { // 如果错误名字不等于空 错误信息
spuser.parent().removeClass('hide'); //移除Class里('hide')样式 错误信息
spuser.text(arg.error.name[0].messages); // 用户
}
if (arg.error.email != null) {
spemail.parent().removeClass('hide');
spemail.text(arg.error.email[0].messages); // 邮箱
}
if (arg.error.password != null) {
sppwd.parent().removeClass('hide');
sppwd.text(arg.error.password[0].messages); // 密码
}
if (arg.error.confirm_password != null) {
spcnpwd.parent().removeClass('hide');
spcnpwd.text(arg.error.confirm_password[0].messages); // 确认密码
}
if (arg.error.check_code != null) {
$msg.parent().removeClass('hide');//移除隐藏提示标签
$msg.text(arg.error.check_code[0].messages);
}
var img = $('#check_code_img')[0];//图片验证码变量
img.src = img.src + '?';//重载图片验证码
$('#check_code').val('');//验证码框清空 刷新页面后 变成 空
$('#confirm_password').val('');//刷新页面后 变成 空
}
}
})
})
}
//刷新验证码
function changeCheckCode(ths) {
ths.src = ths.src + '?';
}
</script>
{% endblock %}
{## ————————42PerfectCRM实现AJAX全局账号注册————————#}
{#global_ajax_register.html#}
{#gbacc_base.html#}
{## ————————38PerfectCRM实现全局账号登录注销————————#}
{#模板文件 #}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
{# <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。#}
{# <meta> 标签位于文档的头部,不包含任何内容。<meta> 标签的属性定义了与文档相关联的名称/值对。#}
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="/static/gbacc_img/gbacc_logo.jpg">{# icon,指的是图标 #}
<title>全局账号</title> {# 页面头部显示#}
{# 使用link来调用外部的css文件#}
<link rel="stylesheet" href="/static/gbacc_css/bootstrap.css" /> {#导航栏样式#}
<link rel="stylesheet" href="/static/gbacc_css/dashboard.css" /> {#指示板样式#}
</head>
<body>
{% block body %}{#自定义内容 body#}{% endblock %}
{# 将纯JavaScript的语句另外保存在一个"*.js"的文件中,需要时再调用。#}
<script src="/static/gbacc_js/jquery.js"></script> {# jQuery 是一个 JavaScript库,极大地简化了 JavaScript 编程。#}
<script src="/static/gbacc_js/bootstrap.js"></script> {#指示板JS事件#}
{# # ————————42PerfectCRM实现AJAX全局账号注册————————#}
{% block js %}{#自定义内容 JS#}{% endblock %}
{# # ————————42PerfectCRM实现AJAX全局账号注册————————#}
</body>
</html>
{## ————————38PerfectCRM实现全局账号登录注销————————#}
{#gbacc_base.html#}

Django项目:CRM(客户关系管理系统)--51--42PerfectCRM实现AJAX全局账号注册的更多相关文章
- Django项目:CRM(客户关系管理系统)--70--60PerfectCRM实现CRM学生上课记录
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- Django项目:CRM(客户关系管理系统)--63--53PerfectCRM实现CRM客户报名流程缴费
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- Django项目:CRM(客户关系管理系统)--56--47PerfectCRM实现CRM客户报名流程01
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- Django项目:CRM(客户关系管理系统)--74--64PerfectCRM实现CRM课程排名详情
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- Django项目:CRM(客户关系管理系统)--72--62PerfectCRM实现CRM讲师讲课记录
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- Django项目:CRM(客户关系管理系统)--54--45PerfectCRM实现账号快速重置密码
# gbacc_ajax_urls.py # ————————42PerfectCRM实现AJAX全局账号注册———————— from django.conf.urls import url fro ...
- Django项目:CRM(客户关系管理系统)--53--44PerfectCRM实现账号快速注册登陆
# gbacc_ajax_urls.py # ————————42PerfectCRM实现AJAX全局账号注册———————— from django.conf.urls import url fro ...
- Django项目:CRM(客户关系管理系统)--55--46PerfectCRM实现登陆后页面才能访问
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- Django项目:CRM(客户关系管理系统)--52--43PerfectCRM实现AJAX全局账号登陆
# gbacc_ajax_urls.py # ————————42PerfectCRM实现AJAX全局账号注册———————— from django.conf.urls import url fro ...
随机推荐
- eclipse-帮助文档
Eclipse开发环境配置 1. java环境 安装 本系统使用java6开发,老师使用1.6.0 _45版本开发,如下图所示: “开发工具”目录提供了1.6.0 _45版本32位和6 ...
- iOS开发系列-NSURLConnection
概述 NSURLConnection是负责发送请求,建立客户端与服务端的连接.发送数据给服务器,并收集来自服务器的响应数据.其中NSURLRequest类是用来封装一个请求,包含NSURL对象.请求方 ...
- Codeforces Round #479 (Div. 3) 题解 977A 977B 977C 977D 977E 977F
A. Wrong Subtraction 题目大意: 定义一种运算,让你去模拟 题解: 模拟 #include <iostream> #include <cstdio> ...
- WPF 先显示登录成功,验证成功后显示主窗口
/// 设置显示登录窗口的方法: /// 在 App.xaml 中把这句 /// 删掉 StartupUri="MainWindow.xaml" 改为 StartupUri=&qu ...
- Android开发 音视频开发需要了解的专业术语知识
前言 在摸索一段时间的音视频开发后,越来越发现这个坑的深度真是特别的深. 除了了解Android自带的音视频处理API以外,还得了解一些视频与音频方面的知识.这篇博客就是主要讲解这方面的专业术语.内容 ...
- Spring Cache 简介
org.springframework.cache; org.springframework.cache.Cache org.springframework.cache.CacheManager 依赖 ...
- SpringData_03_Specifications动态查询
有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询.相比JPQL, ...
- php判断一个值是否在一个数组中,区分大小写-也可以判断是否在键中
function in_array_case($value,$array){ return in_array(strtolower($value),array_map('strtolower',$ar ...
- day 39 MySQL之多表查询
MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都 ...
- rsync命令集合
rsync -avz rsync://logs@211.151.78.206/www_logs/2014/03/27/* /mnt/hgfs/iautoslogs/