当前位置: 首页 > 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…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...