首页 >后端开发 >Python教程 >Django AllAuth 章 使用自定义字段扩展 Django AllAuth 用户模型

Django AllAuth 章 使用自定义字段扩展 Django AllAuth 用户模型

王林
王林原创
2024-08-13 14:32:38568浏览

注意:本文最初发布在我的 Substack 上,网址为 https://andresalvareziglesias.substack.com/

这是 Django AllAuth 系列文章的最后一章。在这五章中,我们发现了一个小奇迹,一个非常有用的 Django 组件来处理我们所有的身份验证需求。在本章中,我们将学习如何扩展基本的 Django 用户模型以添加自定义字段。

章节列表

  • 第 1 章 - Django 中的 Auth 一体化解决方案
  • 第 2 章 - 如何安装和配置 Django AllAuth
  • 第 3 章 - 使用 Django AllAuth 进行社交登录
  • 第 4 章 - 自定义 Django AllAuth UI
  • 第 5 章 - 使用自定义字段扩展 Django AllAuth 用户模型 ←这个!

Django AllAuth Chapter  Extending Django AllAuth user model with custom fields

Django 用户模型

AllAuth 使用标准 Django 用户模型,加上一些额外的表来处理社交登录和登录令牌。在 Django 5 中,用户模型位于 django.contrib.auth 包中,并且有一堆预定义字段,您可以在官方文档中阅读:

  • https://docs.djangoproject.com/en/5.0/ref/contrib/auth/

有时,这对于我们的项目来说还不够。 Django 允许您创建自定义用户表和用户管理器,来处理每个项目的需求。

我们将创建一个自定义用户表和一个自定义 UserManager 来处理我们的登录和注册过程。

创建自定义用户表

在我们的示例项目中打开 models.py 并编写如下代码:

class MyCustomUser(AbstractBaseUser):
   email = models.EmailField(unique=True)
   first_name = models.CharField(max_length=30, blank=True)
   last_name = models.CharField(max_length=30, blank=True)
   is_active = models.BooleanField(default=True)
   is_admin = models.BooleanField(default=False)
   timezone = models.CharField(max_length=30, default='UTC')
   is_custom = models.BooleanField(default=False)
   is_staff = models.BooleanField(default=False)
   created_at = models.DateTimeField(auto_now_add=True)
   updated_at = models.DateTimeField(auto_now=True)

   objects = MyCustomUserManager()
   USERNAME_FIELD = 'email'
   EMAIL_FIELD = 'email'

   def __str__(self):
       return self.email
   def has_perm(self, perm, obj=None):
       return True
   def has_module_perms(self, app_label):
       return True

   @property
   def is_utc(self):
       return self.timezone == 'UTC'

我们可以定义一个从 Django 的 AbstractBaseUser 模型扩展的新 User 模型。在这个新模型中,我们可以添加我们需要的所有字段或自定义属性。

这些行很重要:

   objects = MyCustomUserManager()
   USERNAME_FIELD = 'email'
   EMAIL_FIELD = 'email'

通过这些行,我们将用户模型与自定义 UserManager 链接起来,并且我们还定义了充当唯一“用户名”的字段。

请记住在 admin.py 中注册新模型,以便通过 Django 管理工具对其进行管理。

from django.contrib import admin
from .models import MyCustomUser

admin.site.register(MyCustomUser)

创建自定义用户管理器

在我们的示例项目中再次打开 models.py(或者如果需要,可以为自定义 UserManager 生成另一个文件)并编写如下代码:

class MyCustomUserManager(BaseUserManager):

   def create_user(self, email, password=None):
       if not email:
           raise ValueError('Users must have an email address')

       user = self.model(
           email=self.normalize_email(email),
       )

       user.set_password(password)

       user.save(using=self._db)
       return user

   def create_superuser(self, email, password):
       user = self.create_user(
           email=email,
           password=password,
       )

       user.is_admin = True
       user.is_staff = True

       user.save(using=self._db)
       return user

在此示例中,我们将扩展 BaseUserManager 来创建自定义 UserManager。它创建我们的新用户,并按照我们的预期填充自定义字段。

我们在自定义用户模型的 UserManager 之前定义,因此 Django 知道在新用户创建期间要使用什么类。

使用自定义用户管理器和模型

在项目的设置文件中,我们可以使用以下命令设置项目的当前用户模型:

# Set custom user model as the active one
AUTH_USER_MODEL = 'demo.MyCustomUser'

# Configure AllAuth username related management, because we are 
# using the e-mail as username. See:
# https://docs.allauth.org/en/latest/account/advanced.html
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = None

只需这个小更改(以及像往常一样所需的数据库迁移),我们就可以开始使用 AllAuth 注册视图创建用户,以查看我们闪亮的自定义 UserManager 及其正在运行的模型。快速又简单。

我们还禁用 AllAuth 用户名相关管理,因为我们在此示例中使用电子邮件作为用户名。

这就是结局……还是没有?

我们已经到了 AllAuth 系列的最后一章。 AllAuth 是一个很棒的库,可以处理我们应用程序中的身份验证,并且由于其大量的预定义集成,使得使用社交登录变得特别容易。

这是本系列的最后一章,但我将在以后的文章中重新讨论 AllAuth。感谢您的阅读并祝您编码愉快!

关于名单

在 Python 和 Docker 帖子中,我还将撰写其他相关主题(总是技术和编程主题,我保证......祈祷),例如:

  • 软件架构
  • 编程环境
  • Linux操作系统
  • 等等

如果您发现了一些有趣的技术、编程语言或其他什么,请告诉我!我总是乐于学习新东西!

关于作者

我是 Andrés,一位来自帕尔马的全栈软件开发人员,我正在踏上提高编码技能的个人旅程。我也是一位自行出版的奇幻作家,以我的名字出版了四本小说。有什么问题都可以问我!

以上是Django AllAuth 章 使用自定义字段扩展 Django AllAuth 用户模型的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn