Skip to content

Django - 评论

重要提示: 内置的 django.contrib.comments 框架,曾是 Django 核心的一部分,在 Django 1.6 中已弃用 (deprecated),并在 Django 1.8 中完全移除 (removed)。它不再包含在 Django 中。

虽然原始框架已不存在,但对评论系统的需求依然存在。你有以下几个选择:

  • 使用第三方包 (Third-Party Package):社区维护着一个名为 django-contrib-comments 的包,它提供了与旧框架类似的功能。这通常是搭建一个熟悉的评论系统最简单的方式。
  • 使用外部服务 (External Service):集成一个托管评论平台,如 Disqus 或 Commento。这些服务会为你处理评论后端,通常能简化设置和管理(审核)。
  • 自行构建 (Build Your Own):对于特定需求或需要完全控制,你可以使用 Django 模型、表单 (forms) 和视图 (views) 构建自定义评论系统。这提供了最大的灵活性,但需要更多的开发工作量。

使用 django-contrib-comments(第三方包)

Section titled “使用 django-contrib-comments(第三方包)”

本节演示如何使用流行的 django-contrib-comments 包,它复制了旧框架的功能。

  1. 安装:
pip install django-contrib-comments
  1. 配置 (settings.py):
# 将 'django_comments' 和 'django.contrib.sites' 添加到 INSTALLED_APPS
INSTALLED_APPS = [
# ... 其他应用
'django.contrib.sites',
'django_comments',
'myapp', # 你的应用,包含你希望添加评论的模型
# ...
]
# 添加 SITE_ID 设置。sites 框架需要此项。
# 通常,1 用于主站点。
SITE_ID = 1

如果你的 Django 项目服务于多个网站,django.contrib.sites 框架允许将数据(如评论)与特定的“站点”关联。对于单个站点,设置 SITE_ID = 1 是标准做法。

  1. 数据库迁移:
# 创建评论和站点所需的数据库表
python manage.py migrate
  1. 包含 URL (urls.py):
# 在你的主项目 urls.py 中(例如,myproject/urls.py)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('myapp/', include('myapp.urls')), # 你的应用的 URL
path('comments/', include('django_comments.urls')), # 添加评论应用的 URL
]
  1. 在模板中使用评论:

假设你有一个 myapp.models.Article 模型,并希望在其详情页 (article_detail.html) 添加评论。

myapp/views.py
from django.shortcuts import render, get_object_or_404
from .models import Article
def article_detail_view(request, pk):
article = get_object_or_404(Article, pk=pk)
return render(request, 'myapp/article_detail.html', {'article': article})
myapp/templates/myapp/article_detail.html
{% extends "base.html" %}
{% load comments %}
{% block title %}{{ article.title }}{% endblock %}
{% block content %}
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
<hr>
<h2>评论</h2>
{# 显示评论数量 #}
{% get_comment_count for article as comment_count %}
<p>这篇文章有 {{ comment_count }} 条评论。</p>
{# 显示评论表单 #}
<h3>发表评论:</h3>
{% render_comment_form for article %}
{# 显示评论列表 #}
<h3>现有评论:</h3>
{% render_comment_list for article %}
{% endblock %}

模板标签说明:

  • {% load comments %}: 加载所需的模板标签。
  • {% get_comment_count for [object] as [varname] %}: 获取指定模型实例(此处为 article)的评论数量,并将其存储在 comment_count 变量中。
  • {% render_comment_form for [object] %}: 渲染用于发表与对象相关的评论的默认表单。
  • {% render_comment_list for [object] %}: 渲染与对象关联的已批准评论列表。

完成设置后,访问文章详情页将显示评论数量、评论表单以及任何已有的评论。

django-contrib-comments 支持评论管理 (moderation)(评论显示前需要批准)、电子邮件通知以及表单和模板的自定义。有关这些高级功能的详细信息,请参阅该包的官方文档。

如果 django-contrib-comments 不符合你的需求:

  • Disqus/Commento: 易于集成,将评论的托管和管理卸载到外部服务。通常包括社交登录、高级管理和分析等功能。可能需要用户与第三方服务进行交互。
  • 自行构建: 在 Django 中创建一个 Comment 模型,使用 ForeignKey 指向其关联的内容类型(使用 django.contrib.contenttypes),并可能关联一个用户。构建表单和视图来处理创建和显示。提供完全控制,但需要时间。

根据你的项目需求,选择最能平衡易用性、所需功能和开发资源的方法。

延伸阅读: