|
|
# 赵瑞萍:评论模型模块,定义评论数据结构及关联关系
|
|
|
# 功能:存储用户对文章的评论信息,支持嵌套回复,包含评论内容、时间、作者、关联文章等核心数据
|
|
|
# 特性:支持国际化显示、级联删除关联数据、默认排序规则及评论状态管理
|
|
|
|
|
|
# 赵瑞萍:导入Django核心模块,提供配置、数据库操作、时间处理和国际化支持
|
|
|
from django.conf import settings # 获取项目配置(如用户模型)
|
|
|
from django.db import models # 数据库模型基类及字段类型
|
|
|
from django.utils.timezone import now # 获取带时区的当前时间,用于时间字段默认值
|
|
|
from django.utils.translation import gettext_lazy as _ # 国际化翻译工具,实现多语言显示
|
|
|
from django.utils.html import escape # 新增导入
|
|
|
|
|
|
# 赵瑞萍:导入关联模型,评论需与博客文章建立关联关系
|
|
|
from blog.models import Article # 博客文章模型,评论将关联到具体文章
|
|
|
|
|
|
|
|
|
class Comment(models.Model):
|
|
|
"""
|
|
|
赵瑞萍:评论模型类,映射数据库中存储评论的表结构
|
|
|
记录评论的内容、时间、作者、关联文章、父评论及显示状态等信息
|
|
|
支持评论嵌套回复和国际化管理
|
|
|
"""
|
|
|
# 赵瑞萍:评论正文字段,限制最大300字符,避免内容过长
|
|
|
body = models.TextField('正文', max_length=300)
|
|
|
|
|
|
# 赵瑞萍 comments/models.py
|
|
|
# 赵瑞萍 将 creation_time 改为 created_time(与迁移文件保持一致)
|
|
|
created_time = models.DateTimeField(_('creation time'), default=now)
|
|
|
last_modify_time = models.DateTimeField(_('last modify time'), default=now)
|
|
|
|
|
|
# 赵瑞萍:评论作者外键,关联项目配置的用户模型
|
|
|
# 级联删除:当用户账号被删除时,其发布的所有评论也会被删除
|
|
|
author = models.ForeignKey(
|
|
|
settings.AUTH_USER_MODEL,
|
|
|
verbose_name=_('author'), # 国际化字段名:作者
|
|
|
on_delete=models.CASCADE
|
|
|
)
|
|
|
|
|
|
# 赵瑞萍:关联文章外键,评论属于某篇具体文章
|
|
|
# 级联删除:当文章被删除时,其下所有评论也会被删除
|
|
|
article = models.ForeignKey(
|
|
|
Article,
|
|
|
verbose_name=_('article'), # 国际化字段名:文章
|
|
|
on_delete=models.CASCADE
|
|
|
)
|
|
|
|
|
|
# 赵瑞萍:父评论自关联外键,实现评论嵌套回复功能
|
|
|
# 允许为空:顶级评论(直接评论文章)无父评论
|
|
|
# 级联删除:当父评论被删除时,其所有回复评论也会被删除
|
|
|
parent_comment = models.ForeignKey(
|
|
|
'self',
|
|
|
verbose_name=_('parent comment'), # 国际化字段名:上级评论
|
|
|
blank=True, # 表单提交时允许为空
|
|
|
null=True, # 数据库中允许为NULL
|
|
|
on_delete=models.CASCADE
|
|
|
)
|
|
|
|
|
|
# 赵瑞萍:评论显示状态字段,用于评论审核功能
|
|
|
# 默认值为False(需审核后显示),不允许为空
|
|
|
is_enable = models.BooleanField(
|
|
|
_('enable'), # 国际化字段名:是否启用
|
|
|
default=False,
|
|
|
blank=False,
|
|
|
null=False
|
|
|
)
|
|
|
|
|
|
# 赵瑞萍:模型元数据配置,定义模型的整体行为和显示规则
|
|
|
class Meta:
|
|
|
ordering = ['-id'] # 默认排序:按ID降序,最新评论优先显示
|
|
|
verbose_name = _('comment') # 模型单数显示名称(国际化)
|
|
|
verbose_name_plural = verbose_name # 模型复数显示名称(与单数相同)
|
|
|
get_latest_by = 'id' # 使用latest()方法时,按ID字段判断最新记录
|
|
|
|
|
|
# 赵瑞萍:定义模型实例的字符串表示形式
|
|
|
# 在后台管理和调试时,直观显示评论内容(取正文作为标识)
|
|
|
def __str__(self):
|
|
|
return self.body
|
|
|
|
|
|
def save(self, *args, **kwargs):
|
|
|
# 保存前转义 HTML 特殊字符
|
|
|
self.body = escape(self.body)
|
|
|
super().save(*args, **kwargs) |