Django-------重写User模型

news2024/11/8 17:05:43

在 Django 中,重写自带的 auth 或 User 模型的原因通常涉及项目特定的需求和对用户数据管理的灵活性要求。以下是一些常见的原因:

  1. 自定义用户字段
    • Django 自带的 User 模型提供了基本的用户字段,如用户名、密码、邮箱等。但对于某些项目来说,这些字段可能不足以满足需求。例如,可能需要添加额外的用户信息,如姓名、电话号码、地址等。
    • 通过重写 User 模型,可以添加自定义的字段,以便更好地存储和管理用户数据。
  2. 自定义用户认证
    • Django 的 auth 模块提供了用户认证功能,但默认情况下,它是基于用户名和密码的。在某些项目中,可能需要使用其他认证方式,如邮箱认证、手机短信认证或第三方社交账号认证。
    • 重写 User 模型和相关的认证后端可以使项目支持自定义的认证逻辑。
  3. 扩展用户权限管理
    • Django 的权限管理系统允许为每个用户分配不同的权限,以控制他们对网站资源的访问。然而,在某些项目中,可能需要更复杂的权限管理逻辑,如基于角色的权限管理(RBAC)或基于声明的访问控制(ABAC)。
    • 通过重写 User 模型和相关的权限管理逻辑,可以实现更复杂的权限管理需求。
  4. 与其他系统集成
    • 在一些项目中,可能需要将 Django 与其他系统集成,如 LDAP、Active Directory 或其他用户管理系统。
    • 重写 User 模型和相关的认证后端可以使 Django 能够与这些系统集成,实现统一的用户管理和认证。
  5. 符合特定业务逻辑
    • 某些项目可能有特定的业务逻辑要求,如用户注册时必须填写某些字段、用户密码的加密方式等。
    • 通过重写 User 模型和相关的逻辑,可以确保用户数据符合项目的特定业务逻辑。
  6. 优化数据库结构
    • 在某些情况下,可能需要优化数据库结构以提高性能或满足特定的数据关系要求。
    • 重写 User 模型可以允许对数据库表结构进行自定义,以满足这些要求。
  7. 解决兼容性问题
    • 在一些旧版本的 Django 中,自带的 User 模型可能不支持某些新特性或与其他库存在兼容性问题。
    • 通过重写 User 模型,可以解决这些兼容性问题,使项目能够使用最新的 Django 特性或与其他库兼容。

Django中自带的有auth和User模型:

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username and password are required. Other fields are optional.
    """

    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _("username"),
        max_length=150,
        unique=True,
        help_text=_(
            "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
        ),
        validators=[username_validator],
        error_messages={
            "unique": _("A user with that username already exists."),
        },
    )
    first_name = models.CharField(_("first name"), max_length=150, blank=True)
    last_name = models.CharField(_("last name"), max_length=150, blank=True)
    email = models.EmailField(_("email address"), blank=True)
    is_staff = models.BooleanField(
        _("staff status"),
        default=False,
        help_text=_("Designates whether the user can log into this admin site."),
    )
    is_active = models.BooleanField(
        _("active"),
        default=True,
        help_text=_(
            "Designates whether this user should be treated as active. "
            "Unselect this instead of deleting accounts."
        ),
    )
    date_joined = models.DateTimeField(_("date joined"), default=timezone.now)

    objects = UserManager()

    EMAIL_FIELD = "email"
    USERNAME_FIELD = "username"
    REQUIRED_FIELDS = ["email"]

    class Meta:
        verbose_name = _("user")
        verbose_name_plural = _("users")
        abstract = True

    def clean(self):
        super().clean()
        self.email = self.__class__.objects.normalize_email(self.email)

    def get_full_name(self):
        """
        Return the first_name plus the last_name, with a space in between.
        """
        full_name = "%s %s" % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        """Return the short name for the user."""
        return self.first_name

    def email_user(self, subject, message, from_email=None, **kwargs):
        """Send an email to this user."""
        send_mail(subject, message, from_email, [self.email], **kwargs)

但里面有一些方法实例的定义是在我们自己的项目中是用不到的,比如first_name、second_name

等等

所以我们要重写我们的User模型,以满足我们的具体项目的需要

class OAUser(AbstractBaseUser, PermissionsMixin):
    """
    自定义的User模型
    """

    realname = models.CharField( max_length=150,unique=False,)#OA项目需求,用于实名
    email = models.EmailField( blank=False, unique=True ) #邮箱,以邮箱作为登录的凭证,所以不能为空
    telephone = models.CharField( max_length=150,blank=True) #手机号,用于用户信息

    #关注status,无需关注is_active
    is_staff = models.BooleanField(default=True)
    is_active = models.BooleanField(default=True)
    status = models.IntegerField(choices=UserStatusChoices, default=UserStatusChoices.UNACTIVAE)

    date_joined = models.DateTimeField(auto_now_add=True)

    objects = OAUserManager()

    EMAIL_FIELD = "email"
    #USERNAME_FIELD: 用来鉴权的,会把authenticate的username参数,传给USERNAME_FIELD指定的字段
    USERNAME_FIELD = "email" #这里用来鉴权的,因为username会重复,但email是唯一的
    #REQUIRED_FIELDS:指定哪些字段是必须要传的,但不能包含USERNAME_FIELD和EMAIL_FIELD中已经设置的值
    REQUIRED_FIELDS = ["realname", "password"]

继承自AbstractBaseUser, PermissionsMixin,在我们的重写的模型中增加了email.真实姓名,电话号码等等

由于我们需要获取我们的用户创建等等


    objects = OAUserManager()

,然后再重写UserManaer模型,作为管理模型,实现用户的创建,和超级用户的创建等等

重写USerManager:

class OAUserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self,realname, email, password, **extra_fields):
        """
        创建用户
        """
        if not realname:
            raise ValueError("必须设置真实姓名") #返回错误信息
        email = self.normalize_email(email) #对邮箱进行标准化

        user = self.model(realname=realname, email=email, **extra_fields)
        user.password = make_password(password)
        user.save(using=self._db)
        return user


    def create_user(self, realname, email=None, password=None, **extra_fields):
        """
        创建普通用户
        """
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", False)
        return self._create_user(realname, email, password, **extra_fields)

    def create_superuser(self, realname, email=None, password=None, **extra_fields):
        """
        创建超级用户
        """
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        extra_fields.setdefault("status", UserStatusChoices.ACTIVE)

        if extra_fields.get("is_staff") is not True:
            raise ValueError("超级用户必须设置is_staff=True.")
        if extra_fields.get("is_superuser") is not True:
            raise ValueError("超级用户必须设置is_superuser=True.")

        return self._create_user(realname, email, password, **extra_fields)

然后在setting.py的最后用我们重新写的模型覆盖掉原django的模型

#覆盖dajngo自带的User模型
AUTH_USER_MODEL = 'oaauth.OAUser'

"""
语法是:
aap.重新写的模型名
"""

执行

 python manage.py createsuperuser

进行超级用户的创建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2235956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试—功能测试详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、测试项目启动与研读需求文档 (一) 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产…

第十五届蓝桥杯C/C++B组题解——数字接龙

题目描述 小蓝最近迷上了一款名为《数字接龙》的迷宫游戏,游戏在一个大小为N N 的格子棋盘上展开,其中每一个格子处都有着一个 0 . . . K − 1 之间的整数。游戏规则如下: 从左上角 (0, 0) 处出发,目标是到达右下角 (N − 1, N …

【9695】基于springboot+vue的学生就业管理系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取免费源码 项目描述 本学生就业管理系统以springboot作为框架&#xff…

Android使用scheme方式唤醒处于后台时的App场景

场景:甲App唤醒处于后台时的乙App的目标界面Activity,且乙App的目标界面Activity处于最上层,即已经打开状态,要求甲App使用scheme唤醒乙App时,达到跟从桌面icon拉起App效果一致,不能出现只拉起了乙App的目标…

centos7,yum安装mongodb

yum安装mongodb 1.配置MongoDB的yum源2.安装Mongodb3.启动Mongodb4.配置远程访问5.设置mongo密码 1.配置MongoDB的yum源 1.创建yum源文件,输入命令: vim /etc/yum.repos.d/mongodb-org-5.0.repo然后在文件中输入以下内容并保存: [mongodb-…

SpringBoot项目集成ONLYOFFICE

ONLYOFFICE 文档8.2版本已发布:PDF 协作编辑、改进界面、性能优化、表格中的 RTL 支持等更新 文章目录 前言ONLYOFFICE 产品简介功能与特点Spring Boot 项目中集成 OnlyOffice1. 环境准备2. 部署OnlyOffice Document Server3. 配置Spring Boot项目4. 实现文档编辑功…

【华为HCIP实战课程31(完整版)】中间到中间系统协议IS-IS路由汇总详解,网络工程师

一、IS-IS的汇总 1、可以有效减少在LSP中发布的路由条目,减小对系统资源的占用。 2、会减少LSP报文的扩散,接收到该LSP报文的其他设备路由表中只会出现一条聚合路由。 3、可以避免网络中的路由震荡,提高了网络的稳定性。 4、被聚合的路由可以是IS-IS路由,也可以是被引入…

LabVIEW编程过程中为什么会出现bug?

在LabVIEW编程过程中,Bug的产生往往源自多方面原因。以下从具体的案例角度分析一些常见的Bug成因和调试方法,以便更好地理解和预防这些问题。 ​ 1. 数据流错误 案例:在一个LabVIEW程序中,多个计算节点依赖相同的输入数据&#…

Vatee万腾平台:让企业数字化转型更轻松、更高效

在数字化浪潮席卷全球的今天,企业数字化转型已成为不可逆转的趋势。然而,对于许多企业来说,数字化转型并非易事,它涉及到技术、人才、流程等多个方面的变革。为了帮助企业顺利实现数字化转型,Vatee万腾平台应运而生&am…

STM32G0xx使用LL库将Flash页分块方式存储数据实现一次擦除可多次写入

STM32G0xx使用LL库将Flash页分块方式存储数据实现一次擦除可多次写入 参考例程例程说明一、存储到Flash中的数据二、Flash最底层操作(解锁,加锁,擦除,读写)三、从Flash块中读取数据五、测试验证 参考例程 STM32G0xx HAL和LL库Flash读写擦除操…

若依管理系统使用已有 Nacos 部署流程整理

背景 玩了一下开源项目 RuoYi 管理系统Cloud 版,卡住的地方是:它用到了 nacos 配置管理,如果用的 nacos 环境是单机且是内置数据库的话,该怎么配置呢? 本文整理本机启动 RuoYi Cloud 应用本地部署的过程,…

快速学习Python框架FastAPI

FastAPI是一种现代、快速(高性能)的Web框架,用于Python 3.6,使用Python类型提示构建API。它的设计初衷是帮助开发者在短时间内开发出高性能的API服务。FastAPI的灵感来源于许多高性能的编程框架,包括Express、Django R…

scala Map集合

一.Map的概述 Map是一种存储键值对的数据结构,Map中的键都是唯一的。 idea实例 二.Map的常见操作 idea实例 三.Map中的查询元素 idea实例 四.Map的常用方法 idea实例 五.Map的遍历 idea实例

Zabbix监控架构

目录 1. Zabbix监控架构-CS架构 2. Zabbix极速上手指南 主机规划 2.1 部署ngxphp环境并测试 检查安装结果 2.2 部署数据库 2.3 编译安装zabbix-server服务端及后续配置 2.4 部署前端代码代码进行访问 前端的配置文件(连接数据库与主机名等信息) 2.5 欢迎来到zabbix 2…

基于vue+neo4j 的中药方剂知识图谱可视化系统

前言 历时一周时间,中药大数据R02系统中药开发完毕,该系统通过scrapy工程获取中药数据,使用python pandas预处理数据生成知识图谱和其他相关数据,利用vuespringbootneo4jmysql 开发系统,具体功能请看本文介绍。 简要…

Java——》try-with-resource

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

数据结构---二叉树(顺序结构),堆(上)

树 树的概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。 PS 有⼀个特殊的结点&#xff…

蓝桥杯-网络安全比赛题目-遗漏的压缩包

小蓝同学给你发来了他自己开发的网站链接, 他说他故意留下了一个压缩包文件,里面有网站的源代码, 他想考验一下你的网络安全技能。 (点击“下发赛题”后,你将得到一个http链接。如果该链接自动跳转到https,…

HTB:Busqueda[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机进行开放端口扫描 使用ffuf对该域名进行路径FUZZ 直接使用浏览器访问靶机80端口主页面 直接到Github上寻找相关PoC、EXP USER_FLAG:0f2686aebbdb4c728050281a6fb742cf 特权提升 ROOT_FLAG:dde68ef…

如何创建备份设备以简化 SQL Server 备份过程?

SQL Server 中的备份设备是什么? 在 SQL Server 中,备份设备是用于存储备份数据的物理或逻辑介质。备份设备可以是文件、设备或其他存储介质。主要类型包括: 文件备份设备:通常是本地文件系统中的一个或多个文件。可以是 .bak 文…