|
|
# 导入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最大的为最新) |