我的网站搭建 (第21天) 评论功能设计

一、前言

    为什么一直拖着评论功能到现在才开始准备写,确实因为最近较忙,而且评论功能确实也不好写。之前,我上网查了很久,大概的方法总结起来有下面三个。

    方法一:第三方社会化评论插件,如友言,多说,畅言,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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值