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 ModelForm类生成表单

    1. 定义ModelForm类 #froms.py from django import forms from app01.modles import User class UserModelForm(forms.ModelForm): class Meta: model = User #关联的model类 fields = “__all__” #或(‘na…

    Django 2023年4月13日
    00
  • Django+Vue打造购物网站(八)

    购物车、订单管理和远程调试 添加商品到购物车 trade/serializers.py from rest_framework import serializers from goods.models import Goods from trade.models import ShoppingCart class ShopCartSerializer(ser…

    Django 2023年4月9日
    00
  • django 分页出现 UnorderedObjectListWarning 错误

    django 分页出现此错误: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class ‘monitor.models.HostBind’> QuerySet. allow_empty_f…

    Django 2023年4月16日
    00
  • Django用户登录与注册系统的实现示例

    下面我将详细讲解“Django用户登录与注册系统的实现示例”的完整攻略,包含两条示例说明。 第一条示例:创建Django项目并实现用户登录 1. 创建Django项目并配置数据库 首先我们需要创建一个Django项目,可以使用django-admin命令或者IDE自带的创建项目功能来创建。 然后,我们要配置数据库。在settings.py文件中,找到DATA…

    Django 2023年5月16日
    00
  • django 修改 request 对象中的请求参数, 并重新赋值给 request 对象

    直接上代码, 实现流程看代码及注释 def your_view(self, request): method = request.method if method == “GET”: # 使用 querydict对象的copy()方法, 获取一个可修改的querydict data = request.GET.copy() # 修改参数值 data = pa…

    Django 2023年4月9日
    00
  • django+uwsgi+daphne+supervisor生产环境部署

    一、前言   在上一篇文章中项目中使用了webscoket进行实时通讯,但是生产环境又使用了django+nginx+uwsgi的部署方式,我们都知道uwsgi并不能处理websocket请求,所以需要asgi服务器来处理websocket请求,官方推荐的asgi服务器是daphne,下面将介绍详细的部署步骤。   二、软件安装   之前已经写过一一篇关于d…

    Django 2023年4月16日
    00
  • Apache上部署Django步骤详细介绍

    关于“Apache上部署Django步骤详细介绍”的攻略,我将给出以下完整的步骤,其中包含两条示例说明。 环境要求 在部署Django应用之前,需要确保已安装以下环境: Apache服务器 mod_wsgi 步骤一:创建Django项目 在部署Django应用前,首先需要先创建一个Django项目。可以使用django-admin工具创建一个名为myproj…

    Django 2023年5月15日
    00
  • Django实现文件上传下载功能

    下面我将为你详细讲解“Django实现文件上传下载功能”的完整攻略,包含以下两部分内容: 文件上传功能实现步骤 首先,在Django项目中创建一个文件上传的视图,可以在views.py中创建: from django.shortcuts import render from django.http import HttpResponse def upload…

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