继承自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的更多相关文章

  1. 165.扩展User模型-继承AbstractBaseUser

    继承自AbstractBaseUser模型 如果你想要修改默认的验证方式,并且对于User模型上的一些字段不想要,那么可以自定义一个模型,然后继承自AbstractBaseUser,再添加你想要的字段 ...

  2. Odoo中的模型继承、视图继承、Qweb模板继承详解

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826114.html 在实际开发过程中,经常会遇到需要修改Odoo原生逻辑的情况.然而,直接修改Odoo底 ...

  3. 162.扩展User模型-使用Proxy模型

    扩展用户模型: Django内置的User模型虽然已经足够强大了,但是有时候还是不能满足我们的需求,比如在验证用户登录的时候,它用的是用户名作为验证,而我们有时候需要通过手机号码或者是邮箱进行验证,还 ...

  4. Java+7入门经典 - 6 扩展类与继承 Part 1/2

    第6章 扩展类与继承 面向对象编程的一个重要特性: 允许基于已定义的类创建新的类; 6.1 使用已有的类 派生 derivation, 派生类 derived class, 直接子类 direct s ...

  5. Django用户继承AbstractUser后密码为明文

    Django用户继承AbstractUser后密码为明文 其实本不应该有这个问题,却花了我很久的时间,因为还是初学阶段. 造成这个原因是因为在admin注册的生活没有指定Admin 在app的admi ...

  6. Django-models,继承AbstractUser类

    1.UserInfo类继承了Django模型自带的User类,需要导入AbstractUser   2.然后在settings.py中配置

  7. Django用户认证模块中继承AbstractUser与AbstractBaseUser重写User表的区别

    AbstractUser和AbstractBaseUser看起来十分相似,如果你不熟悉djiango的auth重写User,那你很容易弄错,导致一堆bug. 我们查看AbstractUser的源码得知 ...

  8. Java+7入门经典 - 6 扩展类与继承 Part 2/2

    6.12 设计类 1) 通过已定义的基类派生子类, 并且添加方法和数据成员来自定义子类, 创建出类的层次结构; Dog 'IS-A' Animal 2) 定义一系列没有层次结构, 由类对象作为数据成员 ...

  9. .NET MVC4 实训记录之二(扩展WebSecurity模型下的UserProfile表)

    使用VS2013创建MVC4项目后,自动生成的代码中默认使用WebSecurity模型创建用户管理,生成以下数据库:

随机推荐

  1. opencv —— findContours、drawContours 寻找并绘制轮廓

    轮廓图像与 Canny 图像的区别 一个轮廓一般对应一系列的点,也就是图像中的一条曲线.轮廓图像和 Canny 图像乍看起来表现几乎是一致的,但其实组成两者的数据结构差别很大: Canny 边缘图像是 ...

  2. 基于SSM开发学生信息管理系统源码

    开发环境:    Windows操作系统开发工具: Eclipse+Jdk+Tomcat+MySql数据库 运行效果图 源码及原文链接:https://javadao.xyz/forum.php?mo ...

  3. MySQL的JDBC驱动(8.0版本)

    1.引用外部库  mysql-connector-java-8.0.版本的jar 2.jdbc驱动类:com.mysql.jdbc.Driver  改成 com.mysql.cj.jdbc.Drive ...

  4. oracle数据泵导入导出部分用户

    问题描述:需要将140服务器中的tbomnew实例下的部分用户导入到118服务器下的tbompx实例中,本次导入导出的两个数据库均为19C 部分用户名:CORE,MSTDATA,BOMMGMT,CFG ...

  5. Integer使用==做判断遇到的问题

    问题: 最近使用Integer类型的数据做判断时,遇到了一个神奇的问题. 如: Integer a=223; Integer b=223; 这样使用==做判断,得到的结果是 false 原因: 后来查 ...

  6. VB程序去nag

    VB程序去nag 我遇到的vb的nag情况是程序一开始就跳出一个nag,汇编代码如下 push AfKayAs_.004067D4 call <jmp.&MSVBVM50.#100> ...

  7. 流程图GGEditor 之 自定义节点相关属性

    自定义节点 注册 -- registerNode 我们通过以下接口往 G6 全局注册节点: // 注册节点 G6.registerNode(name, { // 绘制 draw(item) {   r ...

  8. 静态库&动态库&导入库

    我遇到的问题 先贴一个StackOverflow上的问题 上面的问题让我知道了更多动态库的知识. 我需要使用一个声音库(irrKlang)为2d游戏提供声音,我使用的编译器是mingw-w64,但是i ...

  9. 浅谈python的第三方库——pandas(一)

    pandas作为python进行数据分析的常用第三方库,它是基于numpy创建的,使得运用numpy的程序也能更好地使用pandas. 1 pandas数据结构 1.1 Series 注:由于pand ...

  10. 【pycharm基本操作】项目创建、切换、运行、字体颜色设置,常见包的安装步骤

    创建新项目 退出项目 怎样区别虚拟环境和系统环境? 虚拟环境和系统环境切换:进入项目切换解释器 切换项目 创建python目录和文件 代码运行方式一: 还可以这样执行代码方式二: 文件的剪切.复制.删 ...