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_site # Create your models here. class BlogUser(AbstractUser): """ 博客用户模型,继承自Django内置的AbstractUser基类 扩展了标准用户模型,增加博客系统特有的字段 """ #ZXY: 昵称字段:用户显示名称,可为空 nickname = models.CharField( _('nick name'), #ZXY: 国际化标签,在admin中显示为"昵称" max_length=100, #ZXY: 最大长度100个字符 blank=True) #ZXY: 允许为空,非必填字段 #ZXY: 创建时间:记录用户账号创建的时间点 creation_time = models.DateTimeField( _('creation time'), #ZXY: 显示为"创建时间" default=now) #ZXY: 默认值为当前时间,自动记录创建时间戳 #ZXY: 最后修改时间:记录用户信息最后一次修改的时间 last_modify_time = models.DateTimeField( _('last modify time'), #ZXY: 显示为"最后修改时间" default=now) #ZXY: 默认值为当前时间 #ZXY: 注册来源:记录用户是通过什么渠道注册的 source = models.CharField( _('create source'), #ZXY: 显示为"创建来源" max_length=100, #ZXY: 最大长度100个字符 blank=True) #ZXY: 允许为空 def get_absolute_url(self): """ 获取用户详情页的URL路径(不含域名) 用于Django的通用视图和admin中的"查看现场"链接 Returns: str: 用户详情页的URL路径,如 '/author/testuser/' """ return reverse( 'blog:author_detail', kwargs={ 'author_name': self.username}) #ZXY: 使用用户名作为URL参数 def __str__(self): """ 定义模型的字符串表示,在admin和shell中显示 这里使用邮箱而不是用户名,便于管理员识别用户 Returns: str: 用户的邮箱地址 """ return self.email def get_full_url(self): """ 获取包含完整域名的用户详情页URL 用于邮件通知、外部链接等需要完整URL的场景 Returns: str: 完整的用户URL,如 'https://example.com/author/testuser/' """ site = get_current_site().domain #ZXY: 获取当前站点的域名 url = "https://{site}{path}".format( site=site, path=self.get_absolute_url()) #ZXY: 组合域名和路径 return url class Meta: """ 模型的元数据配置类 用于定义模型级别的选项和配置 """ ordering = ['-id'] #ZXY: 默认按ID降序排列,新的用户显示在前面 verbose_name = _('user') #ZXY: 单数形式的显示名称 verbose_name_plural = verbose_name #ZXY: 复数形式与单数相同 get_latest_by = 'id' #ZXY: 指定获取最新记录的字段