继承自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. JAVA架构师眼中的高并发架构,分布式架构 应用服务器集群

    前言 高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等. 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并发量等因素,来设计适 ...

  2. javaweb垃圾分类查询系统源码 ssm+mysql

    需求 基于SSM实现一个垃圾分类查询管理系统, 用户可以根据自定义查询分类信息, 管理员可以对分类信息, 垃圾详情信息进行增删改查的管理 运行环境 jdk1.8,tomcat8.5,mysql5.6, ...

  3. 《手把手教你构建自己的 Linux 系统》学习笔记(9)

    目录 autoreconf 命令的作用是什么? aclocal automake -a autoconf 一条命令搞完三面三步 既然有其他的「编译控制软件」为何还是使用 make 来进行编译控制? M ...

  4. 走进MEasy的世界:基于STM32MP1的IOT参考设计

    前言:在万物互联快速发展的趋势下,板卡处理器性能.内存大小.接口外设等都是人们非常关心的硬件参数,但是如何让硬件的作用实现它的功能最大化,一套完善的软件支持尤为重要. 背景:随着HTML5技术的发展, ...

  5. Html介绍,认识html标签

    什么是网页?网页就是我们我们提前写好的代码样式经过浏览器的渲染展示出来的样式效果.其实我们常说的上网就是浏览各式各样的网页,这些网页都是由html标签组成,下面就是一个简单的网页,效果图如下: 简单看 ...

  6. js遇到代码出现问题时如何调试代码

    单步跟踪调试 debugger; 控制台watch功能查看变量当前值 进入函数操作 随着不断点击,不停进行循环,指定变量的值也在发生改变 添加断点 跳入跳出函数 throw new Error() 主 ...

  7. CF1230E Kamil and Making a Stream

    题目大意是求 \(\sum_{v,fa,lca(v,fa)=fa}gcd(v \to fa)\) 容易发现 \(\gcd\) 只会变小,所以根据这玩意是从上到下的,每次暴力一下就可以了,\(\gcd\ ...

  8. mongoose中Documents的save方法

    调用save方法保存数据有的时候是插入有时候是更新, 数据库 我知道save在保存的时候会检测数据的更改,只是更新更改的部分.所以我重复save时,只是createAt更改那么我最后只应该保存了一条数 ...

  9. 无人机通信协议MAVLink简介

    MAVLink MAVLink(Micro Air Vehicle Link,微型空中飞行器链路通讯协议)是无人飞行器与地面站(Ground Control Station ,GCS)之间通讯,以及无 ...

  10. React.js高阶函数的定义与使用

    /* 高阶函数的简单定义与使用 一: 先定义一个普通组件 二: 用function higherOrder(WrappendComponent) { return } 将组件包裹起来,并用export ...