一、前言
为什么一直拖着评论功能到现在才开始准备写,确实因为最近较忙,而且评论功能确实也不好写。之前,我上网查了很久,大概的方法总结起来有下面三个。
方法一:第三方社会化评论插件,如友言,多说,畅言,disqus。
方法二:Django评论库
方法三:自己写代码实现
先从第三方社会化评论插件开始,我没有做过多的涉及,而且插件众多,没有必要多花精力,使用专业的配置上就好,如果想使用评论插件,可以看这篇https://www.cnblogs.com/KevinSong/p/4695899.html。
至于Django的评论库,可以按照官方文档配置一番即可,https://django-contrib-comments.readthedocs.io/en/latest/。
下面开始说重点了,我采用的正好是第三种方法,这种逻辑性比较强,不过难度上确实不低。在这里必须要感谢杨仕航老师的精心讲解,教会了我使用子评论与父评论数据库自关联使用及Ajax加载评论。
二、建立评论模型
一个健全的评论模型,主要应该包括:评论内容、评论时间、评论人、评论对象,其中评论对象包括文章和评论,也就是说除了可以对文章进行评论,还可以对评论进行评论。涉及到对评论进行评论就要区分此时的评论是父评论还是它下面的子评论,这就是数据库自关联的使用。
我将评论模型建立如下,需要解释一下,root字段是某篇文章的源评论,parent字段指的是当前评论的父评论,reply_to则表示评论回复的对象。
from django.db import models
# 跟踪安装在Django驱动项目中的所有模型,为模型提供高级通用界面。
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
# auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理。
from django.contrib.auth.models import User
from django.db.models.fields import exceptions
from blog.models import Post
class Comment(models.Model):
# 创建评论对象
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
# 创建评论内容,不限字数
text = models.TextField(verbose_name=u'评论内容')
# 时间自动创建now
comment_time = models.DateTimeField(verbose_name=u'评论时间', auto_now_add=True)
# 创建作者,删除则级联删除
user = models.ForeignKey(User, verbose_name=u'评论人', related_name='comments', on_delete=models.CASCADE)
# 自关联
root = models.ForeignKey('self', related_name='root_comment', null=True, on_delete=models.CASCADE)
parent = models.ForeignKey('self', related_name='parent_comment', null=True, on_delete=models.CASCADE)
reply_to = models.ForeignKey(User, related_name="replies", null=True, on_delete=models.CASCADE)
def get_comment(self):
# 此处的一个异常处理,用来捕获没有计数对象的情况
# 例如在admin后台中,没有计数值会显示为‘-’
try:
post = Post.objects.get(id=self.object_id)
return post.title
# 对象不存在就返回0
except exceptions.ObjectDoesNotExist:
return 0
get_comment.short_description = '文章'
def __str__(self):
return self.text
class Meta:
ordering = ['comment_time']
verbose_name = '评论'
verbose_name_plural = '评论'
建立好评论模型后,别忘记将Comment应用注册到INSTALLED_APPS中,还需新建adminx.py文件,将字段显示在后台。
from django.contrib import admin # admin后台管理
from .models import Comment # 从当前应用的模型中导入Comment数据表
import xadmin
class CommentAdmin(object):
# 后台显示文章对象,评论内容,评论时间,评论者
list_display = ('id', 'get_comment', 'text', 'comment_time', 'user')
xadmin.site.register(Comment, CommentAdmin)
三、服务器端基础
在正式写服务器代码前,先看一下有关评论功能的服务器端基本架构。如果只是简单地在前端页面使用input框或者textarea标签,一般使用POST提交,在服务器端接收一下就行了,比较简单。
from dj