本文节选自笔者博客: https://www.blog.zeeland.cn/archives/3o2inaz
- 💖 作者简介:大家好,我是Zeeland,全栈领域优质创作者。
- 📝 CSDN主页:Zeeland🔥
- 📣 我的博客:Zeeland
- 📚 Github主页: Undertone0809 (Zeeland) (github.com)
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 📣 系列专栏:django开发手册🍁
- 💬介绍:The mixture of software dev+Iot+ml+anything🔥
Django专栏
- 【django开发手册】Django 中使用自定义用户模型:一个比自带 User 更强的选择
- 【django开发手册】如何使用select_related进行一次连表查询
- 【django开发手册】drf通过添加自定义字段优化DRF序列化器,轻松实现高速API
- 【django开发手册】解决admin添加外键下拉显示外键的问题
- 【Django Rest Framework优化实践】ResponseResult、异常处理方法详解
- 【DRF】深度分析枚举类型在DRF中的序列化问题及解决方案
- 【django开发手册】关于django admin添加表信息的时候外键无法为空的问题解决方案
- 【django开发手册】django admin如何显示外键对应的字段
- 【django开发手册】DRF外键模型查询没有信息?教你实现序列化返回
前言
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 的官方文档,并按照上述方法进行实现。