一、CRM框架简介

二、登录之设计表

在登录之前,我们需要用到django内置的登录验证去做,必须得使用django定义好的表结构或者我们重写表,使用一些我们需要的字段来进行验证。没有重写之前的表为USER表,它所在的位置为:from django.contrib.auth.models import User

源码:User继承了AbstractUser表

class User(AbstractUser):"""Users within the Django authentication system are represented by thismodel.Username and password are required. Other fields are optional."""class Meta(AbstractUser.Meta):swappable = 'AUTH_USER_MODEL'

源码:AbstractUser继承了AbstractBaseUser和PermissionsMixin

class AbstractUser(AbstractBaseUser, PermissionsMixin):"""An abstract base class implementing a fully featured User model withadmin-compliant permissions.Username and password are required. Other fields are optional."""username_validator = UnicodeUsernameValidator()username = models.CharField(

我们只需要重写AbstractUser表,示例如下:

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager, Userclass UserProfile(AbstractBaseUser, PermissionsMixin):username = models.EmailField(max_length=255,unique=True,)is_staff = models.BooleanField(_('staff status'),default=False,help_text=_('Designates whether the user can log into this admin site.'),)is_admin = models.BooleanField(default=False)name = models.CharField('名字', max_length=32)department = models.ForeignKey('Department', default=None, blank=True, null=True)mobile = models.CharField('手机', max_length=32, default=None, blank=True, null=True)memo = models.TextField('备注', blank=True, null=True, default=None)date_joined = models.DateTimeField(auto_now_add=True)USERNAME_FIELD = 'username'   #定义使用的账户字段REQUIRED_FIELDS = ['name']class Meta:verbose_name = '账户信息'verbose_name_plural = "账户信息"def get_full_name(self):# The user is identified by their email addressreturn self.namedef get_short_name(self):# The user is identified by their email addressreturn self.usernamedef __str__(self):  # __unicode__ on Python 2return self.usernamedef has_perm(self, perm, obj=None):#     "Does the user have a specific permission?"# Simplest possible answer: Yes, alwaysif self.is_active and self.is_superuser:return Truereturn _user_has_perm(self, perm, obj)def has_perms(self, perm_list, obj=None):#     "Does the user have a specific permission?"# Simplest possible answer: Yes, alwaysfor perm in perm_list:if not self.has_perm(perm, obj):return Falsereturn Truedef has_module_perms(self, app_label):#     "Does the user have permissions to view the app `app_label`?"#     Simplest possible answer: Yes, alwaysif self.is_active and self.is_superuser:return Truereturn _user_has_module_perms(self, app_label)

当需要这张表生效时,需要在settings.py中加入AUTH_USER_MODEL = 'crm.UserProfile'

三、登录视图函数和路由

urls.py

from django.conf.urls import url,include
from django.contrib import admin
from crm import viewsurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^login/', views.login,name='login'),url(r'^register/', views.register,name='register'),url(r'^index/', views.index,name='index'),url(r'^logout/', views.logout,name='logout'),url(r'^change_pwd/', views.change_pwd,name='change_pwd'),url(r'^crm/', include('crm.urls')),
]

Model == 强大的数据库操作,弱小的数据验证
Form ==强大的数据验证
ModelForm ==二者结合,强大的数据验证,适中的数据库操作。在ModelForm是能够封装一个model对象

froms.py

from django import forms
from crm import models
from django.core.exceptions import ValidationError# 注册form
class RegForm(forms.ModelForm):password = forms.CharField(   #重写models中定义的字段label='密码',widget=forms.widgets.PasswordInput(attrs={'placeholder': '请输入密码'}),min_length=6,error_messages={'required': '密码不能为空', 'min_length': '最小长度为6'})re_password = forms.CharField(   #新定义的字段label='确认密码',widget=forms.widgets.PasswordInput(attrs={'placeholder': '请再次确认密码'}),min_length=6,error_messages={'required': '密码不能为空', 'min_length': '最小长度为6'})class Meta:model = models.UserProfile# fields = '__all__'   # 所有字段fields = ['username', 'password', 're_password', 'name', 'department']  # 指定字段# exclude = [''] #排除的字段widgets = { #定义插件,加入属性提示信息'username': forms.widgets.EmailInput(attrs={'placeholder': '请输入用户名'}),'name': forms.widgets.TextInput(attrs={'placeholder': '请输入姓名'}),}labels = {  #显示名称'username': '用户名','password': '密码','name': '姓名','department': '部门',}error_messages = {'username': {'required': '账号不能为空',},'name': {'required': '姓名不能为空',}}#遍历所有字段def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for filed in self.fields.values():filed.widget.attrs.update({'class': 'form-control'})#对clean_data的数据先进行一次验证def clean(self):pwd = self.cleaned_data.get('password')re_pwd = self.cleaned_data.get('re_password')if pwd == re_pwd:return self.cleaned_dataself.add_error('re_password', '两次密码不一致')raise ValidationError('两次密码不一致')

views.py

from django.shortcuts import render, HttpResponse, reverse, redirect
from django.contrib import auth
from django.contrib.auth.decorators import login_required  #登录校验
from .models import UserProfile  #用户表
from crm.forms import RegFormdef login(request):if request.method == "POST":username = request.POST.get('username')password = request.POST.get('password')print(username, password)ok = auth.authenticate(username=username, password=password)#Django提供的auth方法去数据库中验证用户if ok:auth.login(request, ok)return redirect(reverse('customer'))return render(request, 'login.html')def register(request):form_obj = RegForm()  #实例化字段if request.method == "POST":form_obj = RegForm(request.POST)if form_obj.is_valid():print("校验成功")form_obj.cleaned_data.pop('re_password')  # 剔除重复的密码UserProfile.objects.create_user(**form_obj.cleaned_data)return redirect(reverse('login'))return render(request, 'register.html', context={"form_obj": form_obj})@login_required
def index(request):return render(request, 'index.html')#注销登录
def logout(request):auth.logout(request) return redirect(reverse('login'))#改密
def change_pwd(request):error = ''if request.method == "POST":username = request.POST.get('username')password = request.POST.get('password')new_password = request.POST.get('new_password')re_new_password = request.POST.get('re_new_password')ok = auth.authenticate(username=username, password=password)print(request)if ok:auth.login(request, ok)print("原账户密码正确")if new_password:print("密码不是空")if new_password == re_new_password:print("两次密码一致")request.user.set_password(new_password)request.user.save()return redirect(reverse('login'))else:error = "两次密码不一致"else:error = "密码不能为空"else:error = "原账户或密码不正确"return render(request, 'change_pwd.html', context={"error": error})

四、前端代码实现

1.配置settings.py

#当前端有时间显示时,会按照以下格式进行显示
DATETIME_FORMAT = 'Y-m-d H:i:s'
DATE_FORMAT = 'Y-m-d'STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')
]AUTH_USER_MODEL = 'crm.UserProfile'   #生效的账户表
LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由

2.导入静态文件

bootstrap框架和jquey框架还有小图标框架等
前端框架 https://www.bootcdn.cn/
小图标框架 http://fontawesome.dashgame.com/

3.寻找模板
寻找合适的登录或者注册界面框架,提取需要代码和配置文件

4 login.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{% static 'css/reset.css' %}"><link rel="stylesheet" href="{% static 'css/style.css' %}"></head>
<body>
<div id="particles-js"><div class="login"><div class="login-top">登录</div><div class="login-center clearfix"><div class="login-center-img"><img src="{% static 'imgs/name.png'%}"></div><form action="" method="post">{% csrf_token %}<div class="login-center-input"><input type="text" name="username" value="admin" placeholder="请输入您的用户名" onfocus="this.placeholder=''"onblur="this.placeholder='请输入您的用户名'"><div class="login-center-input-text">用户名</div></div></div><div class="login-center clearfix"><div class="login-center-img"><img src="{% static 'imgs/password.png'%}"></div><div class="login-center-input"><input type="password" name="password" value="" placeholder="请输入您的密码" onfocus="this.placeholder=''"onblur="this.placeholder='请输入您的密码'"><div class="login-center-input-text">密码</div></div></div><div style="text-align: center"><button class="login-button">登录</button></div><div style="text-align: right; margin-top:50px;margin-right:50px;font-size:18px;"><a href="{% url 'change_pwd'%}" style="margin-right:120px">修改密码</a><a href="{% url 'register'%}">注册</a></div></div></form><div class="sk-rotating-plane"></div><canvas class="particles-js-canvas-el" width="616" height="754" style="width: 100%; height: 100%;"></canvas>
</div>
<!--<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>--><script src="{% static 'js/particles.min.js' %}"></script>
<script src="{% static 'js/app.js' %}"></script></body>
</html>

5.register.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>注册页面</title><style>input{width:300px;height:30px;padding:10px;}.i5{font-size:20px;}span{margin-right:50px;}button{margin-top:30px;width:60px;height:35px;text-align:center;margin-right:50px;}span{color:red;}.ii{margin-top:30px;}</style>
</head>
<body>
<div class="i" style="width:500px;margin:50px auto;"><h2>注册页面</h2><form action="" method="post" novalidate>{% csrf_token %}<div class="i1 ii">{{ form_obj.username }}</div><span>{{ form_obj.username.errors.0 }}</span><div class="i2 ii">{{ form_obj.password }}</div><span>{{ form_obj.password.errors.0 }}</span><div class="i3 ii">{{ form_obj.re_password }}</div><span>{{ form_obj.re_password.errors.0 }}</span><div class="i4 ii">{{ form_obj.name }}</div><span>{{ form_obj.name.errors.0 }}</span><div class="i5 ii">部门:{{ form_obj.department }}</div><span>{{ form_obj.department.errors.0 }}</span><div class="submit"><button>提交</button></div></form>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script><script>$('input').focus(function () {$('span').text('')})
</script>
</body>
</html>

6.change_pwd.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>修改密码</title><style>{margin:0;}input{width:300px;height:30px;margin-bottom:20px;padding:10px;}button{width:60px;height:35px;text-align:center;margin-right:50px;}span{color:red;}.i5{margin-bottom:15px;}</style>
</head>
<body>
<div class="i" style="width:500px;margin:50px auto;"><h2>修改密码页面</h2>
<form action="" method="post" >{% csrf_token %}
<div class="i1"><input type="text" name="username" value="" placeholder="请输入账号"></div>
<div class="i2"><input type="password" name="password" value="" placeholder="请输入密码"></div>
<div class="i3"><input type="password" name="new_password" value="" placeholder="请输入您的新密码"></div>
<div class="i4"><input type="password" name="re_new_password" value="" placeholder="请再次输入您的新密码"></div><div class="i5"><span>{{ error }}</span></div><button>提交</button>
</form>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script><script>$('input').focus(function () {$('span').text('')})
</script>
</body>
</html>

五、效果

具体字段功能不一一演示了


第五十七篇 Django-CRM系统-1登录,注册,修改密码相关推荐

  1. springboot项目系列-论坛系统04登录注册实现

    springboot项目系列-论坛系统04登录注册实现 论坛地址:http://www.cywloveyou.top 注册(使用AJAX,邮件任务,RabbitMQ) 首先跳转到注册页面,进行注册,跳 ...

  2. Mysql学习篇之---Windows环境下安装 (修改密码)

    Mysql学习篇之---Windows环境下安装 (修改密码) 前言: 自己瞎鼓捣本机上的Mysql,结果导致mysql密码用那个都登录不进去了. 解决方案: 首先把mysql重新删除掉,重新解压了一 ...

  3. Django用户认证管理系统(登录|注册|找回密码(邮箱找回)|注销)

    版本: 1. Python 3.6.2 2. Django 1.11.6 3. 虚拟环境 Virtualenv 网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整 ...

  4. 尚医通项目101-123:前台用户系统、登录注册、邮箱登录

    开始时间:2022-05-30 课程链接:课程链接:[尚医通] 前端页面 需要完成医院等级.地区查询.医院列表.医院名称模糊查询等功能 按等级查询 按地区查询 模糊查询 并能跳转到具体详情页面 跳转到 ...

  5. android 实现Sqlite的增删改查及系统的登录注册功能

    文章目录 1.用户实体类 2.SQLiteOpenHelper类 3.数据库名常量类 4.数据库增删改查方法封装 5.界面设计 5.1 登录页面 5.2 注册界面 5.3 修改密码界面 6. 源码下载 ...

  6. Mac 系统的 MySQL 如何修改密码(保姆级别教程)

    要修改 Mac 系统上的 MySQL 密码,可以按照以下步骤进行: 打开终端,以管理员身份登录到 MySQL 服务器. sudo mysql -u root -p 输入管理员密码 切换到 MySQL ...

  7. python dashboard django_python终极篇 ---django 模板系统

    模板系统 1. MVC和MTV框架1. MVC M: model 模型 对数据库进行操作 V:view 视图 给用户提供页面 C:controller 控制器 负责调度 传递指令2. MTV: M: ...

  8. “约见”面试官系列之常见面试题之第五十七篇之强制类型转换(建议收藏)

    JS的类型转换,强制转换和隐式转换 JS的类型转换 1.强制转换 通过String(),Number(),Boolean()函数强制转换 var str=123;var str1='123';cons ...

  9. 第五十七篇:VS2015建立一个完整的c++工程:头文件.h 源文件.cpp,自动生成类

    之前没有用VS或者在vs中一个源程序写到底,没有使用C++编一个工程 打开VS2015 ,新建VS win32工程,前面步骤很简单,不再阐述 下面直接开始: 新建一个VC++ win32的程序, 在源 ...

最新文章

  1. android 双击home退出程序,Android项目实战(五十五):部分机型点击home再点图标进入程序不保留再之前界面的问题...
  2. (转)Web Framework 的速度与激情 16 正式上映
  3. 关于mount --bind的理解。
  4. apache安全设置
  5. Django中自定义过滤器的使用
  6. 360手机卫士界面布局学习过程续(一)
  7. PHP输出缓存(output_buffering)小记 -- 尚有疑问
  8. arcgis vue 添加图层优化_行业 | ArcGIS制图技巧(超全)
  9. 【Python】汉诺塔问题
  10. CSS3文字渐变效果
  11. 编程修养 阅读笔记二
  12. IT业最新风险投资排名
  13. imageranger for Mac如何自定义过滤器选项
  14. 将Linux目录下的文件放到子目录中
  15. yuki翻译器钩子_【galgame游戏剧情翻译工具】YUKI整合翻译工具下载
  16. 保姆级windows下mysql数据库安装教程
  17. adb shell中的am pm命令
  18. 解决 animation.FuncAnimation 更新函数无反应的方法
  19. 消费者和生产者问题,管程法和信号灯法
  20. JQuery data方法的使用-遁地龙卷风

热门文章

  1. CVPR 2016 摘要阅读
  2. 干货!任务型对话中的知识管理
  3. C++笔记 关于string的笔记
  4. Python 四舍六入五成双
  5. 掌舵9年,艾伦研究所创始CEO 光荣退休!他曾预言中国AI将领跑世界
  6. html图片靠右浮动 文字左侧环绕,CSS 模拟float实现center文字左右环绕图片的效果...
  7. 服务器c盘logs文件夹,Win10系统Logs文件夹有什么作用Logs文件夹可以删除吗
  8. #9733;思维导图的30个问答
  9. lstm和GRU结构图
  10. 关于在onclick事件传参