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

下面是详细的“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中的Signal代码详解

    下面我会详细讲解“Django中的Signal代码详解”的完整攻略,包括两条示例说明。 什么是Signals Signal是Django框架中一种提供了统一解耦机制的工具。Signal机制可以在软件设计中完成消息的发布和订阅功能。简单来说,Signal是一种django中内部|跨应用程序的非阻塞通信方式。 优点是:1. 内部处理自由方便,不受调用方影响;2.…

    Django 2023年5月15日
    00
  • Django高级编程之自定义Field实现多语言

    下面我会详细讲解“Django高级编程之自定义Field实现多语言”的完整攻略,同时给出两条示例说明。 什么是自定义Field 在Django中,Field是描述模型中每个属性的数据类型和对应的数据库映射关系。Django提供了很多内置的Field类型,如CharField、IntegerField、DateField等等,但是在某些实际场景中,可能需要自定…

    Django 2023年5月16日
    00
  • 使用Django+Pytest搭建在线自动化测试平台

    下面我将为您详细讲解使用Django+Pytest搭建在线自动化测试平台的完整攻略,并提供两条示例说明。 概述 首先,让我们来了解一下Django和Pytest。 Django是一个基于Python的Web框架,它采用了MVC结构,并提供了一系列的工具和API,使得开发Web应用变得更加简单和快速。 Pytest则是一种Python的测试框架,其支持多种类型…

    Django 2023年5月16日
    00
  • django 简单会议室预约(1)

    django 是python的一个web框架,为什么要用django,作者之前用过另一个框架flask,虽然flask比较简单很容易让人学,但是flask没有整体感,会让初学着茫然。 这里我们用django。现在最新版本是django-1.9.2。从1.7开始就有点区别了,后面会讲到。 首先搭建环境: Ubuntu 14.04 Python 2.7.6 Dj…

    Django 2023年4月11日
    00
  • django-pymysql-封装的sql使用

    封装的sql import pymysql def get_list(sql,args): conn = pymysql.connect(host=’127.0.0.1′, port=3306, user=’root’, passwd=”, db=’s4db65′, charset=’utf8′) cursor = conn.cursor(cursor=p…

    Django 2023年4月13日
    00
  • Django中ORM表的创建和增删改查方法示例

    下面我将为您详细讲解Django中ORM表的创建和增删改查方法示例的攻略。 ORM表的创建 在Django中,创建ORM表需要用到模型(Model)类。模型类是Django提供的一种将数据库表映射为Python类的方式,它定义了一个表在数据库中的结构及其所需要具备的特性。 创建ORM表步骤如下: 在项目的app目录下的models.py文件中创建模型类。 例…

    Django 2023年5月16日
    00
  • Django中的文件的上传的几种方式

    Django中的上传文件有多种方式,这里主要介绍三种,分别是使用Django自带的文件上传类、使用第三方库django-storages以及手动实现文件上传。 使用Django自带的文件上传类 Django中自带了一个处理文件上传的类django.forms.ImageField,可以用它来实现上传图片的功能。 在models.py中定义一个ImageFie…

    Django 2023年5月16日
    00
  • 4-Django开发post、get接口

    一、创建django应用程序 方法一:创建django项目时直接创建应用程序     方法二:命令行创建 1、进入manage.py所在目录 2、执行常见命令:python manage.py startapp web   二、启动manage.py 方法一:在parcharm中配置manage.py启动参数为runserver 127.0.0.1:8000…

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