django 自定义用户user模型的三种方法

yizhihongxing

下面是详细的“Django自定义用户User模型的三种方法”的攻略。

1. 为什么要自定义用户模型

默认情况下,Django的用户身份验证系统使用的是django.contrib.auth.models.User模型。它包含用户名、电子邮件和密码等字段。但是很多时候,我们需要增加一些额外的字段,如性别、出生日期等信息,这就需要自定义用户模型。

2. Django自定义用户模型的三种方法

2.1. 继承AbstractBaseUser 和 PermissionsMixin

在Django中,可以通过继承AbstractBaseUserPermissionsMixin来去掉原有的默认模型,并定义自己的用户模型。

示例代码:

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.db import models


class UserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('The Email field must be set')

        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self.create_user(email, password, **extra_fields)


class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    name = models.CharField(max_length=30, blank=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email

2.2. 继承AbstractUser

除了AbstractBaseUserPermissionsMixin,我们还可以选择继承AbstractUser。和继承AbstractBaseUserPermissionsMixin相比,它的实现相对简单。

示例代码:

from django.contrib.auth.models import AbstractUser
from django.db import models


class User(AbstractUser):
    email = models.EmailField(unique=True)

    def __str__(self):
        return self.email

2.3. 继承AbstractBaseUser并结合继承AbstractUser

在自定义用户模型时,我们也可以结合继承AbstractBaseUser和继承AbstractUser。这种方式可以达到“最大灵活性”。

示例代码:

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, AbstractUser
from django.db import models


class UserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('The Email field must be set')

        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self.create_user(email, password, **extra_fields)


class User(AbstractBaseUser, AbstractUser):
    email = models.EmailField(unique=True)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email

3. 结语

总之,在Django中,自定义用户模型很容易。可以根据自己的需要来选择最为适合的自定义方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django 自定义用户user模型的三种方法 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • django admin 添加用户出现外键约束错误

    今天在做mxonline项目时,注册了用户表进admin后,想在后台添加一个用户试试,结果出现了错误,经过一番搜索发现以下两个解决方法,不过我只用了一种 报错信息: IntegrityError: (1452, u’Cannot add or update a child row: a foreign key constraint fails (`mxonl…

    Django 2023年4月11日
    00
  • 利用Python Django实现简单博客系统

    请看以下详细讲解“利用Python Django实现简单博客系统”的完整攻略。 1. 确定博客系统的基本功能 在设计博客系统之前,首先需要明确博客系统的基本功能,例如: 用户可以通过博客网站查看已发布文章; 网站后台管理员可以登录后台管理系统发布新的博客文章; 网站后台管理员可以对已发布的文章进行编辑和删除; 网站前台访客可以通过搜索框搜索博客文章。 2. …

    Django 2023年5月16日
    00
  • django-初始配置(纯手写)详解

    下面是关于“django-初始配置(纯手写)详解”的完整攻略。 1. 安装Django 首先,你需要安装Django。在安装之前,你需要先安装Python。然后,使用以下命令来安装Django: pip install django 如果你使用的是Python3,使用以下命令: pip3 install django 2. 创建Django项目 安装完成Dj…

    Django 2023年5月16日
    00
  • django文档学习之applications使用详解

    “Django文档学习之applications使用详解”是一篇介绍如何使用应用程序(Applications)的文章。应用程序是Django中的一个重要概念,它是一组处理某个特定功能的代码集合,可以提供一些通用的功能,如用户注册、数据展示、认证等,而这些功能都可以在不同的Django项目中复用。 该文章主要包括以下几个方面: 一、应用程序(Applicat…

    Django 2023年5月16日
    00
  • Django 连接mysql数据库中文乱码

    2018年08月25日 20:55:15 可乐乐乐乐乐 阅读数:566   版本:CentOS6.8 python3.6.4 django1.8.2 数据库pymysql 我使用的终端是CentOS终端,CentOS桌面版安装的pycham,windows使用Navicat连接mysql数据库。 我遇到的情况大致这样,在CentOS终端进入mysql,然后查…

    Django 2023年4月10日
    00
  • Django admin实现图书管理系统菜鸟级教程完整实例

    我会提供详细的攻略,包含两个示例说明。 示例一:安装Django 首先,我们需要安装Django。我们可以通过以下步骤来完成: 确定Python版本:Django要求Python 3.6及以上版本。可以通过运行以下命令确定Python版本: python -V 安装pip:pip是Python包管理器,我们可以使用pip来安装Django。在终端中运行以下命…

    Django 2023年5月16日
    00
  • DJANGO复制记录的方法(转载)

    DJANGO复制记录的方法 https://dmyz.org/archives/326 最近的Django项目中有复制记录的需求。数据库里有一张名为Party的表,记录用户创建的party,现在要让用户能够复制一个新的party。本身非常简单的一个功能,但运行的时候出错了。我以为是复制过程出错,所以测试了一下Django中复制记录可能遇到的情况(后来发现是其…

    Django 2023年4月12日
    00
  • Django F对象和Q对象查询详解

    Django中提供了F对象和Q对象用于复杂查询,F对象用于处理字段之间的比较,Q对象用于处理复杂的查询表达式。本文将详细介绍F对象和Q对象的用法,以及提供相关的代码示例。 F对象 F对象用于对数据库中的字段进行比较,可以对字段进行加减乘除等运算。 简单的F对象使用示例 比如我们要查询article表中views字段大于comment字段的文章,可以使用如下代…

    Django 2023年3月12日
    00
合作推广
合作推广
分享本页
返回顶部