# 导入Django内置的抽象用户模型,用于扩展自定义用户功能(包含基础用户名、密码等字段) from django.contrib.auth.models import AbstractUser # 导入Django模型相关类,用于定义数据库表结构 from django.db import models # 导入reverse函数,用于通过URL名称生成对应的URL路径 from django.urls import reverse # 导入now函数,用于获取当前时区的时间(作为字段默认值) from django.utils.timezone import now # 导入翻译工具,用于实现模型字段名称的国际化 from django.utils.translation import gettext_lazy as _ # 导入自定义工具函数get_current_site,用于获取当前站点的域名信息 from djangoblog.utils import get_current_site class BlogUser(AbstractUser): """ 自定义用户模型,继承自Django的AbstractUser 扩展了内置用户模型,增加了昵称、创建时间、修改时间、创建来源等自定义字段 """ # 昵称字段:支持国际化标签,最大长度100,允许空白(不强制填写) nickname = models.CharField(_('nick name'), max_length=100, blank=True) # 创建时间字段:支持国际化标签,默认值为当前时间(调用now函数) creation_time = models.DateTimeField(_('creation time'), default=now) # 最后修改时间字段:支持国际化标签,默认值为当前时间 last_modify_time = models.DateTimeField(_('last modify time'), default=now) # 创建来源字段:记录用户创建的渠道(如adminsite、frontend等),支持国际化标签,允许空白 source = models.CharField(_('create source'), max_length=100, blank=True) def get_absolute_url(self): """ 定义模型实例的绝对URL(标准Django方法) 通过URL名称'blog:author_detail'生成用户详情页的URL,参数为用户名 """ return reverse( 'blog:author_detail', kwargs={ 'author_name': self.username}) # kwargs传递URL所需的用户名参数 def __str__(self): """ 定义模型实例的字符串表示 当打印或引用用户实例时,返回用户的邮箱地址(便于识别) """ return self.email def get_full_url(self): """ 生成用户详情页的完整URL(包含站点域名) 结合当前站点域名和get_absolute_url生成的相对路径,组成完整链接 """ # 获取当前站点的域名(如www.example.com) site = get_current_site().domain # 拼接域名和相对路径,形成完整URL(使用HTTPS协议) url = "https://{site}{path}".format(site=site, path=self.get_absolute_url()) return url class Meta: """ 模型的元数据配置,用于定义模型的显示和行为规则 """ ordering = ['-id'] # 数据查询时的默认排序:按ID降序(最新创建的用户在前) verbose_name = _('user') # 模型的单数显示名称(支持国际化) verbose_name_plural = verbose_name # 模型的复数显示名称(与单数一致,避免英文复数变形问题) get_latest_by = 'id' # 获取"最新记录"时的依据字段:按ID判断(ID最大的为最新)