0

0

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

王林

王林

发布时间:2024-08-14 12:15:34

|

635人浏览过

|

来源于dev.to

转载

注意:本文最初发布在我的 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 章 使用自定义字段扩展 Django AllAuth 用户模型

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。它创建了我们的新用户,并按照我们的预期填充自定义字段。

蓝色商务公司网站(XDcms内核)1.0
蓝色商务公司网站(XDcms内核)1.0

本系统使用的是XDcms内核,在原来基础上做来相应修改 前台修改调用数据,可以使用{loop catid=栏目ID}{/loop}方式调用 主要功能: A、内容管理模型,自定义字段,更方便扩展功能。自带模型:单页模型、新闻模型、产品模型、招聘模型 B、栏目自定义,便于内容管理 C、内容模块化,二次开发更便捷。自带模块:幻灯片、QQ客服、友情链接、自定义表单(在线留言、简历管理) D、模板管理,后台

下载

我们在自定义用户模型的 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。感谢您的阅读并祝您编码愉快!

关于名单

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

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

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

关于作者

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

398

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

398

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

258

2023.07.24

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

500

2024.04.08

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

404

2024.04.08

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

440

2024.04.08

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.2万人学习

Git 教程
Git 教程

共21课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号