重写User模型

Django内置的User模型可能不适合某些项目,我们可能要基于内置的添加一些字段

创建users app

startapp users

修改settings.py配置文件,覆盖默认的user模型

settings.py
添加以下内容
'''是app的名称,和models里的class名称(表名)'''
AUTH_USER_MODEL = "users.UserProfile"

编写users app下的models.py

models.py

from django.db import models
#引用内置的user模型
from django.contrib.auth.models import AbstractUser
# Create your models here. #集成内置的user模型,并添加新的字段
class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=,verbose_name='昵称',default='')
birday = models.DateField(null=True,blank=True,verbose_name='生日')
choice_gender = (
("male","男"),
("female","女"),
)
gender = models.CharField(choices=choice_gender,default='female',max_length=,verbose_name='性别')
address = models.CharField(max_length=,default='',verbose_name='地址')
mobile = models.CharField(max_length=,null=True,blank=True,verbose_name='手机号')
image = models.ImageField(upload_to='image/%Y/%m',default='image/default.png',max_length=) class Meta:
verbose_name = "用户信息"
verbose_name_plural = "用户信息" def __unicode__(self):
return self.username

生成数据表

makemigrtions
migrate

登录数据库查看

自定义登录验证

由于用户表中带email字段,想实现通过email和用户名都能登录,就需要重写django authenticate(登录验证)方法

views.py

from django.shortcuts import render
from django.contrib.auth import authenticate,login
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q from .models import UserProfile,EmailVerfyRecord,Banner #重写的authenticate登录验证
class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
try:
#Q方法的作用是或的意思,acc_login方法把username和password传过来,如果以username为条件去库里查没查到的话,就以email为条件去库里查(因为传过来的username 可能是用户名或者email)
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
#检测username和password是否匹配
if user.check_password(password):
return user
except Exception as e:
return None #登录方法
def acc_login(request):
if request.method == 'POST':
user_name = request.POST.get('username','')
pass_word = request.POST.get('password','')
user = authenticate(username=user_name,password=pass_word)
if user is not None:
if user.is_active:
login(request,user)
return render(request,'index.html')
else:
return render(request,'login.html',{'msg':'用户未激活'})
else:
return render(request, 'login.html',{'mgs':'用户名或密码错误'})
elif request.method == 'GET':
return render(request,'login.html')

settings.py

# AUTH 方法(支持邮箱登录)
AUTHENTICATION_BACKENDS = ('users.views.CustomBackend',)

到此,我们就支持邮箱和用户名登录了

Django学习系列之重写User模型和登录验证的更多相关文章

  1. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

  2. Django学习系列6:使用selenium测试用户交互

    学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...

  3. Django 学习笔记(四) --- 模型和数据库

    人生苦短 ~ Tips:仅适用于 Python 3+(反正差别不大,py2 改改也能用).因为据 Python 之父 Guido van Rossum 说会在 2020 年停止对 Python 2 的 ...

  4. Django学习系列之Form验证

    django表单基础 django表单分类 基于django.forms.Form:所有表单类的父类 基于django.forms.ModelForm:可以和模型类绑定的Form Form验证流程 定 ...

  5. asp.net core系列 45 Web应用 模型绑定和验证

    一. 模型绑定 ASP.NET Core MVC 中的模型绑定,是将 HTTP 请求中的数据映射到action方法参数. 这些参数可能是简单类型的参数,如字符串.整数或浮点数,也可能是复杂类型的参数. ...

  6. Django自定义User模型和登录验证

    用户表已存在(与其他App共用),不能再使用Django内置的User模型和默认的登录认证.但是还想使用Django的认证框架(真的很方便啊). 两个步骤: 1)自定义Use模型,为了区分系统的Use ...

  7. Django学习系列13:Django ORM和第一个模型

    ORM—对象关系映射器,是一个数据抽象层,描述存储在数据库中的表,行和列.处理数据库时,可以使用熟悉的面向对象方式,写出更好的代码. 在ORM的概念中,类对应数据库中的表,属性对应列,类的单个实例表示 ...

  8. Django学习笔记(2)——模型,后台管理和视图的学习

    一:Web投票示例 本节我们首先从全局范围再复习一下Django的概念,让自己对Django的设计理念, 功能模块,体系架构,基本用法有初步的印象. Django初始的详细博客内容:请点击我 该应用包 ...

  9. django学习系列——python和php对比

    python 和 php 我都是使用过,这里不想做一个非常理性的分析,只是根据自己的经验谈一下感想. 在web开发方面,无疑 php 更甚一筹. 从某种角度来说,php 就是专门为 web 定制的语言 ...

随机推荐

  1. iOS-UI控件之UITableView(四)- cell数据刷新

    TableView- 数据刷新 数据刷新 添加数据 删除数据 更改数据 全局刷新方法(最常用) [self.tableView reloadData]; // 屏幕上的所有可视的cell都会刷新一遍 ...

  2. 文档兼容性定义,使ie按指定的版本解析

    作为开发人员,特别是作为Web的前端开发人员 ,最悲催的莫过于要不断的,不断的去调试各种浏览器的显示效果,而这其中最让人头痛的莫过于MS下的IE系列浏览器,在IE系列中的调试我们将会发现没有一个是好伺 ...

  3. (独孤九剑)--PHP简介与现况

    (1)为什么学习PHP? 1.好就业: 2.入门简单,学习周期短,两个月即可: 3.学习编程思路,使编程习惯更加规范: 4.大公司直招: 5.处理大并发数据: 6.开源,所以更加安全 (2)PHP是什 ...

  4. JavaSE-24 多线程

    学习要点 线程概述 Java中的多线程 线程状态 线程调度 线程同步 线程间通信 线程概述 1  进程 进程就是应用程序的执行实例. 进程特征: 动态性:动态产生,动态消亡.进程启动,系统为其分配资源 ...

  5. B4. Concurrent JVM 锁机制(synchronized)

    [概述] JVM 通过 synchronized 关键字提供锁,用于在线程同步中保证线程安全. [synchronized 实现原理] synchronized 可以用于代码块或者方法中,产生同步代码 ...

  6. iOS网络图片缓存SDWebImage

    Web image(网络图像) 该库提供了一个支持来自Web的远程图像的UIImageView类别 它提供了: 添加网络图像和缓存管理到Cocoa Touch framework的UIImageVie ...

  7. popToViewController

    看到群里有人问popToViewController的用法 就写了下了 希望能帮到有需要的人 [self.navigationController popToViewController:[self. ...

  8. 微信小程序UI组件库 iView Weapp快速上手

    概述 今天在网上突然看到iView新出了一个微信小程序的组件库iView Weapp,自己就上手试了一下,发现用起来还是不错的,把自己使用的过程与大家分享下. 一 预览iView组件 1.可以在手机上 ...

  9. mysql事物隔离

    1.读未提交(行锁) 会发生脏读,事物未提交被其他事物看到,未提交的数据为脏数据. 2.读已提交(行锁) 会发生不可重复读,事物开始时,只能看到已经提交了的事物修改. 3.重复读(行锁) 该级别保证了 ...

  10. composer install提示需要输入账号解决方法

    1.问题描述:输入composer install提示需要输入账号,如下所示: 2.解决方法,改用社区的源:composer config -g repo.packagist composer htt ...