本文节选自笔者博客: https://www.blog.zeeland.cn/archives/3o2inaz
Django 是一个非常受欢迎的 Python web 框架,自带的用户认证体系能帮助我们简单地实现注册、登录和权限控制等功能。然而如果需要实现更多的功能,比如自定义用户属性,或者实现不同的用户类型(如普通用户和管理员用户等),使用 Django 自带的 User 模型就可能会变得比较麻烦和受限。这时候,自定义用户模型就成为了一种很好的解决方案。
本篇博客将介绍如何在 Django 中创建自定义用户模型,并给出完整的代码示例。
在实现自定义用户模型之前,需要注意以下几个问题:
下面是一个完整的自定义用户模型的示例代码:
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 的官方文档,并按照上述方法进行实现。