Django User 模块之 AbstractUser 扩展详解
在Django中,用户认证是一个非常重要的模块。Django提供了一套完整的用户认证系统,包括用户注册、登录、密码重置等功能。我们可以通过继承Django提供的User模型来创建自定义用户模型,并添加自定义字段来扩展Django提供的默认用户模型。而继承 AbstractUser 会比继承 User 更加灵活和易于扩展。本文将详细介绍如何使用 AbstractUser 扩展Django提供的默认用户模型。
什么是 AbstractUser
AbstractUser 是Django中的一个抽象类,它继承自 AbstractBaseUser 和 PermissionsMixin,并提供了一套完整的用户认证系统。通过继承 AbstractUser 类,我们可以轻松地创建自定义的用户模型,并添加自定义字段来扩展Django提供的默认用户模型。
如何使用 AbstractUser 扩展用户模型
- 创建一个新的应用,并在应用下创建一个名为 models.py 的文件,编辑文件内容如下:
# 引入Django自带的User模型
from django.contrib.auth.models import AbstractUser
# 引入python自带的datetime库
from datetime import datetime
# 引入django的models模块
from django.db import models
# 继承自AbstractUser
class UserProfile(AbstractUser):
# 选择项,性别只有两种,男,女
GENDER_CHOICES = (
('male', '男'),
('female', '女')
)
# 昵称,不能重复
nick_name = models.CharField(max_length=50, verbose_name='昵称', unique=True)
# 生日
birthday = models.DateField(verbose_name='生日', null=True, blank=True)
# 性别
gender = models.CharField(max_length=6, verbose_name='性别', choices=GENDER_CHOICES)
# 地址
address = models.CharField(max_length=100, verbose_name='地址')
# 电话号码
mobile = models.CharField(max_length=11, verbose_name='电话')
# 头像
image = models.ImageField(upload_to="image/%Y/%m", default='image/default.png', max_length=100, verbose_name='头像')
# meta信息,定义基本信息和排序信息
class Meta:
verbose_name = '用户信息'
verbose_name_plural = verbose_name
# 处理用户昵称,假如用户没有设置昵称,那么就使用默认的用户名
def __str__(self):
return self.nick_name if self.nick_name else self.username
- 在settings.py 文件中配置 AUTH_USER_MODEL,修改为自定义的用户模型:
# settings.py
...
# 指定自定义的用户模型
AUTH_USER_MODEL = 'users.UserProfile'
...
- 执行数据库迁移,创建新模型
python manage.py makemigrations
python manage.py migrate
示例
这里给出两个示例,一个是在使用 AbstractUser 扩展用户模型时添加自定义字段;另外一个则是在 django-auth-ldap 的配置中使用扩展后的用户模型。
示例一:在使用 AbstractUser 扩展用户模型时添加自定义字段
假设我们要添加一个“注册时间”字段。
- 在继承的用户模型中增加 register_time 字段:
class UserProfile(AbstractUser):
... # 其他字段
register_time = models.DateTimeField(auto_now_add=True, verbose_name='注册时间')
- 重新生成数据库迁移:
python manage.py makemigrations
python manage.py migrate
- 使用:
from myapp.models import UserProfile
user = UserProfile.objects.create(username='example', password='123456')
print(user.username, user.register_time)
示例二:使用扩展后的用户模型在 django-auth-ldap 配置中进行用户认证
假设我们使用 django-auth-ldap 进行 LDAP 用户库的身份验证。在此过程中,我们希望使用扩展后的用户模型进行身份验证。
- 更改 LDAP 认证配置:
AUTHENTICATION_BACKENDS = (
'django_auth_ldap.backend.LDAPBackend',
'django.contrib.auth.backends.ModelBackend',
)
AUTH_LDAP_USER_ATTR_MAP = {
'username': 'uid',
'email': 'mail',
'first_name': 'givenName',
'last_name': 'sn',
}
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
'is_staff': 'cn=staff,ou=django,dc=example,dc=com',
'is_superuser': 'cn=superusers,ou=django,dc=example,dc=com',
'user_permissions': lambda group: group.permissions.all(),
}
AUTH_LDAP_BIND_DN = ""
AUTH_LDAP_BIND_PASSWORD = ""
AUTH_LDAP_SERVER_URI = "ldap://ldap.example.com"
AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s,ou=users,dc=example,dc=com"
# 指定使用自定义的 UserProfile 模型进行身份验证
AUTH_LDAP_USER_MODEL = 'users.UserProfile'
AUTH_USER_MODEL = 'users.UserProfile'
- 更改装饰器的配置:
@ldap_auth_required
@login_required
def my_view(request):
...
这样我们就完成了用户模型的扩展,并使用自定义的用户模型进行身份验证。
总结
使用 AbstractUser 可以方便地扩展 Django 提供的默认用户模型。通过继承 AbstractUser,我们可以轻松地创建自定义的用户模型,并添加自定义字段来扩展 Django 提供的默认用户模型。以上为具体的步骤和示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django User 模块之 AbstractUser 扩展详解 - Python技术站