当前位置: 首页 > news >正文

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

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 自定义用户模型的讲解,介绍了具体实现和常见的使用场景。

相关文章:

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

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

顺序表和链表的区别

顺序表和链表的区别 不同点顺序表链表(带头双向循环)存储空间物理上一定连续逻辑上连续物理上不一定连续随机访问(用下标随机访问)支持:O(1)不支持:O(N)任意位置插入或者删除元素可能需要搬移元素&#xf…...

系分-数据库总结

历年试题2024年05月试题 BCN范式,模式分解,触发器类型2023年05月试题 NoSQL基本特点,NoSQL对比,混合数据库2022年05月试题4 两段锁,事务并发,数据一致,本地事务发布20…...

new Date()解析

JavaScript 中的 new Date() 构造函数用于创建一个表示日期和时间的对象。Date 对象使得你可以以多种方式获取、设置和格式化日期和时间。让我们深入解析一下 new Date() 及其用法。 创建 Date 对象 可以通过多种方式创建 Date 对象: 不带参数: let no…...

df 的各种用法 以及与du 的区别

df的用法 在 Linux 中,“df”(disk free)是一个用于显示磁盘空间使用情况的命令。 一、主要功能 它可以列出文件系统的磁盘空间使用情况,包括磁盘总容量、已使用空间、可用空间以及使用率等信息。 二、常见用法及参数 基本用法&a…...

2024年下半年软考准考证什么时候打印?

2024年下半年软考准考证打印入口网址如下: https://bm.ruankao.org.cn/sign/welcome 广东的同学特别注意:准考证打印截止时间是11月8号,也就是考试前一天。一定要提前打印准考证,考试当天是无法打印的。 2024年下半年软考准考证…...

企业安全运行与维护(Enterprise Security Operation and Maintenance)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

每日“亿“题 东方博宜OJ 1424-自然数的分解

原题链接:1424 - 自然数的分解-东方博宜OJ 题目描述 给定自然数 n ,将其拆分成若干自然数的和。输出所有解,每组解中数字按从小到大排列。相同数字的不同排列算一组解。 如,读入整数 3 ,分解方案如下: …...

初识Linux · 文件(1)

目录 前言: 回顾语言层面的文件 理解文件的预备知识 文件和磁盘 使用和认识系统调用函数 前言: 本文以及下篇文章,揭露的都是Linux中文件的奥秘,对于文件来说,初学Linux第一节课接触的就是文件,对于C…...

【MYSQL】mysql约束---自增长约束(auto_increment)

1、概念 在Mysql中,当主键为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。 注意:自增长约束通常与主键放在一起使用。 通过给…...

基于STM32设计的智能学习台灯(华为云IOT)(238)

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成【4】ESP8266工作模式配置1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要1.4 开发工具的选择【1…...

网络层协议 --- IP

序言 在这篇文章中我们将介绍 IP协议,经过这篇文章的学习,我们就会了解运营商到底是如何为我们提供服务的以及平时我们所说的内网,公网到底又是什么,区别是什么? IP 地址的基本概念 1. IP 地址的定义 每一个设备接入…...

Java虚拟机(JVM)介绍

**Java虚拟机(JVM)**是Java平台的核心组件,它提供了一个运行时环境,使得Java程序可以在不同的操作系统和硬件平台上运行而无需修改。 JVM的架构 JVM主要由以下几个部分组成: 类加载器(Class Loader&#xf…...

1000题-计算机网络系统概述

术语定义与其他术语的关系SDU(服务数据单元)相邻层间交换的数据单元,是服务原语的表现形式。在OSI模型中,SDU是某一层待传送和处理的数据单元,即该层接口数据的总和。 - SDU是某一层的数据集,准备传递给下一…...

Authentication Lab | IP Based Auth Bypass

关注这个靶场的其它相关笔记:Authentication Lab —— 靶场笔记合集-CSDN博客 0x01:IP Based Auth Bypass 前情提要 有些开发人员为了图方便,会给站点设置一个 IP 白名单,如果访问站点的用户的 IP 在白名单内,则允许访…...

linux中的火墙优化策略

1.火墙介绍 1. netfilter 2. iptables 3. iptables | firewalld 2.火墙管理工具切换 在rocky9 中默认使用的是 firewalld firewalld -----> iptables dnf install iptables - services - y systemctl stop firewalld systemctl disable firewalld systemctl mask fi…...

GO网络编程(三):海量用户通信系统1:登录功能初步

一、准备工作 需求分析 1)用户注册 2)用户登录 3)显示在线用户列表 4)群聊(广播) 5)点对点聊天 6)离线留言 主界面 首先,在项目根目录下初始化mod,然后按照如下结构设计目录: 海量用户通信系统/ ├── go.mod ├── client/ │ ├──…...

Windows安全加固详解

一、补丁管理 使用适当的命令或工具&#xff0c;检查系统中是否有未安装的更新补丁。 Systeminfo 尝试手动安装一个系统更新补丁。 • 下载适当的补丁文件。 • 打开命令提示符或PowerShell&#xff0c;并运行 wusa.exe <patch_file_name>.msu。 二、账号管…...

JavaScript函数基础(通俗易懂篇)

10.函数 10.1 函数的基础知识 为什么会有函数&#xff1f; 在写代码的时候&#xff0c;有一些常用的代码需要书写很多次&#xff0c;如果直接复制粘贴的话&#xff0c;会造成大量的代码冗余&#xff1b; 函数可以封装一段重复的javascript代码&#xff0c;它只需要声明一次&a…...

云RDS MySQL迁移至本地MySQL

本地准备工作 1.安装:percona-xtrabackup 上传percona-xtrabackup-2.3.9-Linux-x86_64.tar.gz包到/usr/local tar -zxvf percona-xtrabackup-2.3.9-Linux-x86_64.tar.gz mv percona-xtrabackup-2.3.9-Linux-x86_64 percona-xtrabackup 2.创建数据目录 cd /data/ mkdir rds-mys…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...