一、模型概述

Comment 是一个基于 Django 的通用评论系统,具有以下核心功能:
  1. 通用评论:通过 GenericForeignKey 可关联到任意模型
  2. 树形结构:支持无限级嵌套回复(通过 django-mptt 实现)
  3. 公共控制:可控制评论是否公开显示
  4. 用户关联:与用户系统集成,记录评论者信息
  5. 时间戳:自动记录评论创建时间
  6. 完整前端:包含模板、样式和交互脚本

二、字段说明

字段名
类型/关系
描述
参数配置
user
ForeignKey
发表评论的用户
to=settings.AUTHUSERMODEL, ondelete=models.CASCADE, verbosename="用户"
content
TextField
评论内容
maxlength=3000, verbosename="评论内容"
createtime
DateTimeField
创建时间
autonowadd=True, verbosename="创建时间"
contenttype
ForeignKey
关联的内容类型
to=ContentType, ondelete=models.CASCADE
objectid
PositiveIntegerField
关联对象ID
contentobject
GenericForeignKey
通用外键关联对象
('contenttype', 'objectid')
parent
TreeForeignKey
父级评论(树形结构)
to='self', ondelete=models.CASCADE, null=True, blank=True, relatedname='children', verbosename="父评论"
ispublic
BooleanField
是否公开显示
default=False, verbosename="公开显示"

三、核心功能实现

1. 通用外键机制

 
# 可关联到任意模型
from django.contrib.contenttypes.fields import GenericRelation
class Article(models.Model):
    title = models.CharField(maxlength=200)
    comments = GenericRelation(Comment)  # 添加反向关系
 
 

2. 树形结构管理

  • 使用 django-mptt​ 实现高效树形查询
  • 支持无限级嵌套回复
  • 内置字段:treeid, lft, rght, level(MPTT自动管理)

3. 查询方法

 
# 获取特定内容的树形评论
comments = Comment.gettreelist(
    contenttype=ContentType.objects.getformodel(article),
    objectid=article.id,
    ispublic=True
)
 
 

4. 前端渲染

  • 模板标签rendercomments, getcommentscount
  • 递归渲染:使用 {% recursetree %}标签
  • 动态表单:JavaScript 控制回复表单显示/隐藏
  • 响应式设计:Bootstrap 样式支持

四、模板标签功能

1. rendercomments标签

 
{% rendercomments targetobject %}
 
 
渲染指定对象的完整评论树,包括:
  • 评论表单
  • 登录提示
  • 嵌套评论列表
  • 回复交互功能

2. getcommentscount标签

 
{% getcommentscount targetobject as commentcount %}
{{ commentcount }} 条评论
 
 
获取指定对象的公开评论数量。

3. getcontenttypeid过滤器

 
{{ target|getcontenttypeid }}
 
 
获取对象对应的 ContentType ID,用于表单隐藏字段。

五、前端交互功能

1. 评论发布

  • 主评论表单位于评论列表顶部
  • 支持富文本(可扩展)
  • 需要用户登录

2. 回复机制

# 回复按钮触发
点击"回复" → 显示表单 → 自动填充 parent → 提交
 
 

3. 视觉效果

  • 嵌套评论有视觉缩进
  • 表单有平滑动画
  • 响应式布局

六、配置示例

1. 模型集成

 
# 在需要评论的模型中添加
class BlogPost(models.Model):
    title = models.CharField(maxlength=200)
    body = models.TextField()
    allowcomment = models.BooleanField(default=True)
    comments = GenericRelation(Comment)
 
 

2. 视图处理

 
# 评论提交视图示例
def addcomment(request):
    if request.method == 'POST':
        contenttypeid = request.POST.get('contenttype')
        objectid = request.POST.get('objectid')
        parentid = request.POST.get('parent')
        content = request.POST.get('content')

# 创建评论...

 
 

七、性能优化

  1. MPTT索引treeid, lft字段已优化查询
  2. 数据库索引
     
    indexes = [
        models.Index(fields=["contenttype", "objectid"]),
    ]
     
     
  3. 缓存支持:可集成 cachetreechildren(示例中已注释)

八、未来功能

  1. 审核机制:添加 isapproved字段
  2. 点赞功能:添加 likescount字段
  3. 附件支持:添加 attachment字段
  4. @提及:解析内容中的 @username
  5. 通知系统:评论回复时通知相关用户
  6. 敏感词过滤:提交前内容过滤

九、前端控制

后台--系统设置--内容扩展配置中可打开评论开关。模板中将会通过{% if commentsenabled %}来控制评论区域的渲染
打开评论需要注意内容的合规和安全性

这个评论系统提供了完整的评论功能实现,从数据库模型到前端交互一应俱全,支持多级嵌套回复。