164.扩展User模型-继承AbstractUser
继承自AbstractUser:
如果Abstractuser中定义的字段不能够满足你的项目的要求,并且不想要修改原来User对象上的一些字段,只是想要增加一些字段,那么这时候可以直接继承自django.contrib.auth.models.AbstractUser。其实,这个类也是django.contrib.auth.models.User 的父类。
(1)比如我们想要在原来的User模型的基础上添加一个telephone和school字段,示例代码如下:
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
telephone = models.CharField(max_length=11, unique=True)
school = models.CharField(max_length=100)
<!--USERNAME_FIELD代表的是User模型的名字字段的字符串,具有唯一性。如果没有经过修改,默认就是username-->
<!--现在,我们将它修改为telephone,之后我们对用户进行登录验证的时候,就不用使用username了,而是使用telephone-->
USERNAME_FIELD = 'telephone'
最重要的是,如果我们使用这种继承的方式修改了Django内置的User模型,那么我们就需要第一次将User模型映射到数据库中的时候就要将User模型定义好。
如果在修改User模型的表的结构之前已经将Django内置的模型映射到数据库中了。那么,我们就需要将数据库中所有的表删除,并且将项目中生成的脚本文件删除。之后重新执行python manage.py makemigrations; python manage.py migrate命令,就可以在数据库中的user表中看到我们新添加的两个字段telephone和school了。
(2)因为我们为User模型添加了两个字段,并且将USERNAME_FIELD='username'改为了USERNAME_FIELD='telephone',如果我们想要调用User.objects.create_user()创建普通用户的话,并且让用户默认必须输入的只读为telephone,username,password,而没有之前的email,那么就可以重写objects上的create_user()方法,示例代码如下:
from django.contrib.auth.models import AbstractUser, BaseUserManager
<!--重写objects上的方法,之所以定义为UserManager类,是因为User.objects.返回的就是UserManager类-->
class UserManager(BaseUserManager):
<!--创建超级用户和普通用户的差别就是超级用户的is_super=True而普通用户的is_super=False,所以我们可以定义一个普遍的函数用来实现二者的相同的部分,不同的部分就在各个函数中单独定义-->
<!--定义一个两边有一个下划线的方法,就代表这个方法是受到保护的,只能在这个类中使用-->
def _create_user_(self,telephone, username, password, **kwargs):
<!--首先判断telephone是否存在-->
if not telephone:
raise ValueError('请输入手机号!')
if not password:
raise ValueError('请输入密码!')
<!--self:代表的是当前的这个类,我们要为当前的这个类的模型User创建一个实例化的对象-->
user = self.model(telephone=telephone, username=username, password=password)
<!--同样设置密码的话,也可以使用这样的形式-->
<!--user.set_password(password)-->
<!--user.save()-->
return user
def create_user(self, telephone, username, password, **kwargs):
kwargs['is_super'] = False
return self._create_user_(telephone=telephone, username=username, password=password, **kwargs)
def create_superuser(self, telephone, username, password, **kwargs):
kwargs['is_super'] = True
return self._create_user_(telephone=telephone, username=username, password=password, **kwargs)
<!--并且需要在重新定义User的模型中,添加objects = UserManager()-->
(3)之后如果想要我们的User模型生效的话,就需要配置settings.py文件中的AUTH_USER_MODEL = 'appname.modelname',在我们的项目中就是:AUTH_USER_MODEL = 'front.User'。
(4)接下来就可以在views.py文件中使用我们重新定义的User模型添加用户了,示例代码如下:
from django.shortcuts import render
from .models import User
def index(request):
user = User.objects.create_user(telephone="18833332222", username='孤烟逐云', password='111111')
if user:
print("创建成功!")
print('%s' % user.username)
else:
print('fail!')
return render(request,'abstractuser.html')
在我们的数据库表front_user中就可以看到我们创建的用户了。当然了,以上是创建普通用户。
(5)接下来,我们就可以创建超级用户了,只需要将上面代码中的调用create_user()方法换成create_superuser()就可以了,
def index(request):
user = User.objects.create_superuser(telephone="18833334444", username='小龙虾', password='111111')
if user:
print("创建成功!")
print('%s' % user.username)
else:
print('fail!')
return render(request,'abstractuser.html')
(6)接下来就可以使用Django内置的验证方法进行验证了,示例代码如下:
def index(request):
# 登录验证
telephone = request.GET.get('telephone')
password = request.GET.get('password')
<!--需要注意的是,这里的username对应的值是telephone,因为我们在models.py文件中指定了USERNAME_FIELD='telephone'-->
user = authenticate(request, username=telephone,password=password)
if user:
print('您查找的用户是:%s' % user.username)
context = {
'user': user
}
return render(request, 'abstractuser.html', context=context)
在浏览器中输入url:http://127.0.0.1:8000/?telephone=********&password=**** ,就会查找出数据库中对应的user。
164.扩展User模型-继承AbstractUser的更多相关文章
- 165.扩展User模型-继承AbstractBaseUser
继承自AbstractBaseUser模型 如果你想要修改默认的验证方式,并且对于User模型上的一些字段不想要,那么可以自定义一个模型,然后继承自AbstractBaseUser,再添加你想要的字段 ...
- Odoo中的模型继承、视图继承、Qweb模板继承详解
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826114.html 在实际开发过程中,经常会遇到需要修改Odoo原生逻辑的情况.然而,直接修改Odoo底 ...
- 162.扩展User模型-使用Proxy模型
扩展用户模型: Django内置的User模型虽然已经足够强大了,但是有时候还是不能满足我们的需求,比如在验证用户登录的时候,它用的是用户名作为验证,而我们有时候需要通过手机号码或者是邮箱进行验证,还 ...
- Java+7入门经典 - 6 扩展类与继承 Part 1/2
第6章 扩展类与继承 面向对象编程的一个重要特性: 允许基于已定义的类创建新的类; 6.1 使用已有的类 派生 derivation, 派生类 derived class, 直接子类 direct s ...
- Django用户继承AbstractUser后密码为明文
Django用户继承AbstractUser后密码为明文 其实本不应该有这个问题,却花了我很久的时间,因为还是初学阶段. 造成这个原因是因为在admin注册的生活没有指定Admin 在app的admi ...
- Django-models,继承AbstractUser类
1.UserInfo类继承了Django模型自带的User类,需要导入AbstractUser 2.然后在settings.py中配置
- Django用户认证模块中继承AbstractUser与AbstractBaseUser重写User表的区别
AbstractUser和AbstractBaseUser看起来十分相似,如果你不熟悉djiango的auth重写User,那你很容易弄错,导致一堆bug. 我们查看AbstractUser的源码得知 ...
- Java+7入门经典 - 6 扩展类与继承 Part 2/2
6.12 设计类 1) 通过已定义的基类派生子类, 并且添加方法和数据成员来自定义子类, 创建出类的层次结构; Dog 'IS-A' Animal 2) 定义一系列没有层次结构, 由类对象作为数据成员 ...
- .NET MVC4 实训记录之二(扩展WebSecurity模型下的UserProfile表)
使用VS2013创建MVC4项目后,自动生成的代码中默认使用WebSecurity模型创建用户管理,生成以下数据库:
随机推荐
- WebStorm2018破解教程
话不多说,直接上教程: 1,下载压缩包,并解压缩,下载地址如下: 链接:谁点谁知道提取码:9am8 2,双击压缩包中的WebStorm-2018.2.1.exe文件,进行安装. 3,安装完成之后,将压 ...
- Javaweb项目中修改表单时数据回显方法
1.前言 先来说下什么是数据回显,比如我要修改我的个人信息,点击修改按钮后进入修改界面,在这个界面中直接将原来的信息显示在表单中,而不是空表单,这就是数据回显 2.思路 当点击修改的时候,从数据库中查 ...
- mysql 不能加载表问题
记录一次 mysql 5.7 下,出现重启数据库后不能加载特定表的问题处理. 搜索了很多的类似的错误,大多都是说因为外键同名的索引丢失的情况.但在5.7这个版本下,会禁止更新外键关联的索引. 最后经过 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(5)
交叉编译是什么? 交叉编译就是在一个系统上,编译生成另外一个系统运行的程序文件. 「硬件体系结构」和「操作系统」的关系是什么? 硬件体系结构也可以称为架构,主要是通过 CPU 的指令集来进行区分的,操 ...
- java-重写
重写有要求 1. 方法名:必须和父类被重写的方法名相同 2. 形参列表:必须和父类被重写的方法名相同 3. 返回值类型: A. 基本数据类型和void:要求与父类被重写的返回值数据类型一致 B. 引用 ...
- 清北学堂—2020.1提高储备营—Day 1 afternoon(二分、分治、贪心)
qbxt Day 1 afternoon --2020.1.17 济南 主讲:李佳实 目录一览 1.二分法 2.分治 3.贪心 总知识点:基础算法 一.二分法 (1)算法分析:二分法是一种暴力枚举的优 ...
- linux 多并发 连接限制修改
1. 修改 ulimit -a 查看 open files 表示单个用户能打开的最大句柄 如果开发的高并发当个进程打开的句柄需要很大. 修改/etc/security/limits.conf 里面有 ...
- MyBatis mapper文件中使用常量
MyBatis mapper文件中使用常量 Java 开发中会经常写一些静态常量和静态方法,但是我们在写sql语句的时候会经常用到判断是否等于 //静态类 public class CommonCod ...
- JavaSE学习笔记(6)---异常
JavaSE学习笔记(6)---异常 软件程序在运行过程中,非常可能遇到问题,我们称之为异常,英文是:Exception,意思是例外.遇到这些例外情况,或者叫异常,我们怎么让写的程序做出合理的处理 ...
- win10子系统ubuntu忘记密码解决方案
准备部署一个rocket.chat 需要安装mongodb 3.6 准备直接在子系统中安装一下,结果忘记ROOT密码了 找了一下子系统重置密码 记录如下 ubuntu config --defau ...