【django开发手册】Django 中使用自定义用户模型:一个比自带 User 更强的选择

本文节选自笔者博客: https://www.blog.zeeland.cn/archives/3o2inaz

前言

Django 是一个非常受欢迎的 Python web 框架,自带的用户认证体系能帮助我们简单地实现注册、登录和权限控制等功能。然而如果需要实现更多的功能,比如自定义用户属性,或者实现不同的用户类型(如普通用户和管理员用户等),使用 Django 自带的 User 模型就可能会变得比较麻烦和受限。这时候,自定义用户模型就成为了一种很好的解决方案。

本篇博客将介绍如何在 Django 中创建自定义用户模型,并给出完整的代码示例。

快速上手

在实现自定义用户模型之前,需要注意以下几个问题:

  • Django 自带的用户管理视图和模板中使用了 User 来创建表,如果需要自定义用户模型,需要在项目的 settings.py 文件中将 AUTH_USER_MODEL 配置项指向到新的模型。这样才能使用我们自定义的用户模型的所有属性和方法。
  • 自定义用户模型需要继承 AbstractBaseUser 和 PermissionsMixin 模型,其中 AbstractBaseUser 模型定义了最基本的用户信息(用户名和密码),PermissionsMixin 模型主要是用来管理权限的。
  • 自定义用户模型需要定义一个 Manager 类,用于管理和操作数据库。在 Manager 类中实现 create_user、create_superuser 等方法,用于创建普通用户和管理员用户。
  • 自定义用户模型需要定义一个 Admin 类,用于管理后台管理页面,包括 fieldsets、list_display、list_filter、search_fields 等相关属性和方法。

下面是一个完整的自定义用户模型的示例代码:

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

class MyUserManager(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(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

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

class MyUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    is_staff = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return self.is_superuser

    def has_module_perms(self, app_label):
        return self.is_superuser

    @property
    def is_admin(self):
        return self.is_superuser

    @property
    def is_staff(self):
        return self.is_admin
    
class MyUserAdmin(UserAdmin):
    add_form_template = 'admin/auth/user/add_form.html'
    fieldsets = (
        (None, {'fields': ('email', 'password', 'is_staff')}),
        (_('Permissions'), {
            'fields': ('is_active', 'is_superuser'),
            'description': _('Designates whether this user should be treated as '
                             'active, and whether they have all permissions.')
        }),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2'),
        }),
    )
    list_display = ('email', 'is_staff')
    list_filter = ('email', 'is_staff', 'is_superuser', 'is_active', 'groups')
    search_fields = ('email',)
    ordering = ('email',)
    filter_horizontal = ('groups', 'user_permissions',)
    
admin.site.register(MyUser, MyUserAdmin)

代码中,我们自定义了一个 MyUser 模型,继承 AbstractBaseUser 和 PermissionsMixin 模型,包含 email 和 is_staff 两个字段,定义了 MyUserManager 类来操作数据库,MyUserAdmin 类来管理后台管理页面。

在 settings.py 文件中,我们需要将 AUTH_USER_MODEL 配置项指向到这个 MyUser 模型:

AUTH_USER_MODEL = 'myapp.MyUser'

这个设置的作用是将 Django 默认的用户模型替换为我们自己定义的 MyUser 模型,这样就可以在我们的项目中使用我们定义的用户模型的所有属性和方法了。

结论

在 Django 项目中,使用自定义用户模型是实现一些高级用户管理和权限控制的好方法。在使用自定义用户模型之前需要注意阅读 Django 的官方文档,并按照上述方法进行实现。

你可能感兴趣的:(django,django,python,后端)