深入理解 Django 自定义用户模型

news/2024/10/12 13:44:05/

1. 引言

Django 作为一个强大的 Web 框架,内置了用户认证系统。然而,实际项目中我们通常需要扩展用户模型,以满足不同的业务需求。Django 提供了继承 AbstractUser 的方式,让我们能够轻松地定制用户模型。本文将通过一个自定义用户模型的实例,深入解析 Django 自定义用户模型的各个知识点。

2. 自定义用户模型代码示例

下面的代码展示了如何在 Django 中创建一个自定义的用户模型 BlogUser,并添加额外的字段和功能:

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.urls import reverse
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from djangoblog.utils import get_current_siteclass BlogUser(AbstractUser):nickname = models.CharField(_('Nickname'), max_length=100, blank=True)creation_time = models.DateTimeField(_('Creation time'), default=now, editable=False)last_modify_time = models.DateTimeField(_('Last modified time'), auto_now=True)source = models.CharField(_('Source'), max_length=100, blank=True)def get_absolute_url(self):return reverse('blog:author_detail', kwargs={'author_name': self.username})def __str__(self):return self.username if self.nickname == '' else self.nicknamedef get_full_url(self):site = get_current_site().domainreturn f"https://{site}{self.get_absolute_url()}"class Meta:ordering = ['-id']verbose_name = _('User')verbose_name_plural = _('Users')get_latest_by = 'id'

3. 自定义用户模型详解

3.1 继承 AbstractUser

BlogUser 继承了 Django 内置的 AbstractUser,这意味着该模型默认具备了 Django 用户认证系统的基础功能,比如用户名、密码、邮箱、权限等字段。同时,它还允许我们在此基础上添加自定义字段,如昵称、创建时间、修改时间等,从而满足项目的需求。

3.2 自定义字段

nickname:

  • 这是用户的昵称字段,类型为 CharField,最大长度为 100,允许为空。我们通过 gettext_lazy 使用国际化支持,_('Nickname') 使得该字段的名称可以在不同语言环境下翻译显示。

creation_time:

  • 该字段记录了用户创建的时间。它是一个 DateTimeField,使用了 default=now 来自动记录用户实例创建时的时间。通过 editable=False 参数,我们确保该字段在用户创建后无法被手动修改。

last_modify_time:

  • 这个字段记录了用户信息最后一次修改的时间。通过 auto_now=True,我们确保每次修改用户信息时,该字段都会自动更新为当前时间。这个字段非常适合记录数据的变更时间。

source:

  • 该字段记录了用户的创建来源。它同样是一个可选的字符串字段,最大长度为 100。创建来源可以帮助追踪用户的来源信息,如是通过网站注册、社交媒体登录还是其他方式创建。

3.3 get_absolute_url 方法

get_absolute_url 是 Django 模型中的一个常见方法,用于生成模型实例的绝对 URL。在本例中,我们通过 reverse 函数生成用户详情页的 URL。reverse 根据视图的名称 'blog:author_detail' 及用户的 username,动态生成 URL。

这种动态生成 URL 的方式避免了硬编码路径,不仅提高了代码的灵活性,还能在 URL 结构发生变化时轻松进行维护。

示例

def get_absolute_url(self):return reverse('blog:author_detail', kwargs={'author_name': self.username})

当我们调用 get_absolute_url() 时,Django 会生成该用户的详情页 URL,比如 /author/john/

3.4 __str__ 方法

__str__ 方法定义了模型实例的字符串表示。在管理后台或者在调试时,打印模型实例通常会调用此方法。对于用户模型,使用昵称优先作为显示内容,如果用户没有设置昵称,则返回用户名。

示例

def __str__(self):return self.username if self.nickname == '' else self.nickname

这样一来,当用户有昵称时会显示昵称,如果没有昵称就显示用户名,确保用户模型的展示个性化。

3.5 get_full_url 方法

get_full_url 方法返回了完整的用户详情页 URL,包括了站点的域名。我们通过 get_current_site 函数获取当前站点的域名,并拼接绝对 URL,生成完整的链接。这在前端显示用户详情页或者生成分享链接时非常有用。

示例

def get_full_url(self):site = get_current_site().domainreturn f"https://{site}{self.get_absolute_url()}"

这个方法生成的 URL 可能是 https://mywebsite.com/author/john/,适合用于页面的完整链接展示。

3.6 Meta 类

Meta 类用于定义模型的元数据。它可以控制模型的行为,比如数据的默认排序方式、模型在管理后台显示的名称等。

  • orderingordering = ['-id'] 表示查询用户时按 ID 降序排列,即最新创建的用户会首先展示。
  • verbose_name 和 verbose_name_plural: 这些字段定义了模型在管理后台的显示名称。在这里,verbose_name = _('User') 和 verbose_name_plural = _('Users') 确保了单数和复数形式的用户名称可以通过国际化翻译。
  • get_latest_by: 通过 get_latest_by,我们定义了在获取最新记录时以哪个字段为依据。在这里,我们使用了 id 字段来获取最新创建的用户。

4. 自定义用户模型的常见场景

在 Web 应用中,用户模型通常是核心的组成部分,而自定义用户模型的需求在很多场景中都会出现。比如:

  • 博客系统:为用户添加昵称、头像、个人简介等自定义字段,用于展示用户信息。
  • 电商平台:可能需要扩展用户模型以记录用户的地址、购物习惯、订单历史等信息。
  • 社交平台:需要记录用户的注册来源、关注列表、好友等数据。

自定义用户模型为我们提供了极大的灵活性,使得开发者可以根据项目需求灵活调整模型结构。

5. 小结

通过自定义用户模型,Django 提供了强大的扩展能力,使得开发者可以在默认用户模型的基础上添加任意需要的字段和功能。本文详细解读了一个自定义用户模型 BlogUser,展示了如何为用户添加昵称、创建时间、修改时间等字段,并通过 get_absolute_url 和 get_full_url 实现动态 URL 生成。无论是小型网站还是大型系统,自定义用户模型都能极大地满足不同的业务需求,并提升系统的灵活性和可扩展性。


这篇博客专注于 Django 自定义用户模型的讲解,介绍了具体实现和常见的使用场景。


http://www.ppmy.cn/news/1537897.html

相关文章

R中线性回归及其权重和截距的计算

以下是您提供的代码的总结和解析,主要聚焦于线性回归及其权重和截距的计算。 代码解析 数据准备: data women使用内置的 women 数据集,该数据集包含了身高和体重的信息。 绘制散点图: plot(women$height, women$weight,xlab &…

用户在网页上输入一个网址,它整个页面响应的流程是什么?

目录 一、流程的大致过程 二、流程的详细分析 1. 浏览器先分析超链接中的URL 2. DNS解析 3. 建立TCP连接 建立连接(三次握手) HTTP中的请求报文 4. 浏览器发送HTTP请求 5. 服务器处理请求并发送响应 HTTP的响应报文 6. 浏览器接收响应 7. 渲…

力扣题11~20

题11(中等): 思路: 这种题目第一眼就是双循环,但是肯定不行滴,o(n^2)这种肯定超时,很难接受。 所以要另辟蹊径,我们先用俩指针(标志位)在最左端和最右端&am…

Unity3D游戏的内存控制详解

Unity3D是一款流行的游戏引擎,支持多种平台,包括PC、移动设备和VR等。随着游戏的复杂性不断提高,Unity3D的内存管理变得尤为重要。本文将详细介绍Unity3D游戏中的内存控制技术,包括自动内存管理、对象池、延迟加载资源和手动清理资…

Html批量转word工具2.1

2024年10月7日记录: 有客户反馈,2.0刚运行就提示转换完成 有问题就解决。正好国庆假期这几天有空,2.1版就出炉了。 2.1 更新记录: 修复了1个bug:刚运行就提示转换完成 下载地址:Html 转 word 批量处理工具…

电脑端视频通过PCIE到FPGA端转UDP网络视频输出,基于XDMA+PHY芯片架构,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案我这里已有的以太网方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存UDP视频组包发送UDP协议栈MAC数据缓冲FIFO组Tri Mode E…

超详细!大模型面经指南(附答案)

目录 所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门进阶学习资源包》,扫码获取~ 大模型(LLMs)基础面 \1. 目前 主流的开源模型体系 有哪些?\2. prefix LM 和 causal LM 区别是什么?\3. 涌现能力…

线性代数入门:打开数学的另一扇门

线性代数入门:打开数学的另一扇门 线性代数,作为数学的一个重要分支,它不仅是许多科学和工程领域的核心工具,也是理解现代科技的关键。这篇文章将带你走进线性代数的世界,为你揭开这门学科的神秘面纱。 什么是线性代…