python django前端重构_Django搭建个人博客:用django-mptt实现多级评论功能

本文档介绍了如何使用django-mptt库在Django博客中实现多级评论功能。首先,通过修改评论模型,引入MPTTModel以创建树形结构,包括新增parent字段和reply_to字段。接着,进行数据迁移,并调整视图函数以处理多级评论,确保二级评论不超过两级。最后,更新前端模板和JavaScript,以展示和处理多级评论,包括使用Ajax提交表单和处理Modal弹窗。
摘要由CSDN通过智能技术生成

现在我们的博客已经具有评论功能了。随着文章的评论者越来越多,有的时候评论者之间也需要交流,甚至部分评论还能合并成一个小的整体。因此最好是有某种方法可以将相关的评论聚集到一起,这时候多级评论就非常的有用了。

多级评论意味着你需要将模型重新组织为树形结构。“树根”是一级评论,而众多“树叶”则是次级评论。本教程会以第三方库django-mptt为基础,开发多级评论功能。

django-mptt模块包含了树形数据结构以及查询、修改树形数据的众多方法。

任何需要树形结构的地方,都可以用 django-mptt 来搭建。比如目录。

注意:本章新知识点较多,请读者做好心理准备,一定要耐心阅读。

重构模型

既然要建立树形结构,老的评论模型肯定是要修改了。

首先安装django-mptt:

(env) > pip install django-mptt

安装成功后,在配置中注册:

my_blog/settings.py

...

INSTALLED_APPS = [

...

'mptt',

...

]

...

这些你已经轻车熟路了。

接下来,修改评论模型:

comment/models.py

...

# django-mptt

from mptt.models import MPTTModel, TreeForeignKey

# 替换 models.Model 为 MPTTModel

class Comment(MPTTModel):

...

# 新增,mptt树形结构

parent = TreeForeignKey(

'self',

on_delete=models.CASCADE,

null=True,

blank=True,

related_name='children'

)

# 新增,记录二级评论回复给谁, str

reply_to = models.ForeignKey(

User,

null=True,

blank=True,

on_delete=models.CASCADE,

related_name='replyers'

)

# 替换 Meta 为 MPTTMeta

# class Meta:

# ordering = ('created',)

class MPTTMeta:

order_insertion_by = ['created']

...

先引入MPTT相关模块,然后改动下列几个位置:

模型不再继承内置的models.Model类,替换为MPTTModel,因此你的模型自动拥有了几个用于树形算法的新字段。(有兴趣的读者,可以在迁移好数据之后在SQLiteStudio中查看)

parent字段是必须定义的,用于存储数据之间的关系,不要去修改它。

reply_to外键用于存储被评论人。

将class Meta替换为class MPTTMeta,参数也有小的变化,这是模块的默认定义,实际功能是相同的。

这些改动大部分都是django-mptt文档的默认设置。需要说明的是这个reply_to。

先思考一下,多级评论是否允许无限级数?无限级数听起来很美好,但是嵌套的层级如果过多,反而会导致结构混乱,并且难以排版。所以这里就限制评论最多只能两级,超过两级的评论一律重置为两级,然后再将实际的被评论人存储在reply_to字段中。

举例说明:一级评论人为 a,二级评论人为 b(parent 为 a),三级评论人为 c(parent 为 b)。因为我们不允许评论超过两级,因此将 c 的 parent 重置为 a,reply_to 记录为 b,这样就能正确追溯真正的被评论者了。

模型修改完了,添加了很多非空的字段进去,因此最好先清空所有的评论数据,再进行数据迁移。

迁移时出现下面的提示也不要慌,一律选第 1 项、填入数据 0 就可以了:

(env) > python manage.py makemigrations

You are trying to add a non-nullable field 'level' to comment without a default; we can't do that (the database needs something to populate existing rows).

Please select a fix:

1) Provide a one-off default now (will be set on all existing rows with a null value for this column)

2) Quit, and let me add a default in models.py

Select an option: 1

Please enter the default value now, as valid Python

The datetime and django.utils.timezone modules are available,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值