我们知道,在实现BBS项目时,评论的功能是必不可少的。
先配置好环境
(urls)

from django.contrib import admin
from django.urls import path
from app01 import viewsurlpatterns = [path('admin/', admin.site.urls),path('comment/', views.comment),path('index.html/', views.index),]

(models)

class UserInfo(models.Model):name = models.CharField(max_length=32)class News(models.Model):title = models.CharField(max_length=32)class Comment(models.Model):content = models.CharField(max_length=32)news = models.ForeignKey('News',on_delete=models.CASCADE)user_info = models.ForeignKey('UserInfo',on_delete=models.CASCADE)parent = models.ForeignKey('self',related_name='o',null=True,on_delete=models.CASCADE)ctime = models.DateTimeField(auto_now_add=True,null=True)

可以将数据库中的数据,以列表中包含字典的形式打印出来

 #models.xxx.filter(news_id=news_id).values(...)ppp = models.Comment.objects.all().values()print(ppp)

为了方便,我们以数据库的形式手动创建一个列表,不再在数据库中一条条的插入,创建的评论列表如下:

comment_list = [{'id': 1, 'content': 'Python最牛逼', 'user': '搞基建', 'parent_id': None},{'id': 2, 'content': 'Java最牛逼', 'user': '搞基建', 'parent_id': None},{'id': 3, 'content': 'PHP最牛逼', 'user': '搞基建', 'parent_id': None},{'id': 4, 'content': '你最牛逼', 'user': '小比虎', 'parent_id': 1},{'id': 5, 'content': '老师最你比', 'user': '李欢', 'parent_id': 1},{'id': 6, 'content': '郭永昌是...', 'user': '郭永昌', 'parent_id': 4},{'id': 7, 'content': '哈哈我是流氓...', 'user': '崔月圆', 'parent_id': 2},{'id': 8, 'content': '我女朋友好漂亮...', 'user': '崔月圆', 'parent_id': 3},{'id': 9, 'content': '见到你女友,交定你朋友...', 'user': '搞基建', 'parent_id': 8},{'id': 10, 'content': '见到你女友,交定你朋友...', 'user': '鼻环', 'parent_id': None},{'id': 11, 'content': '我是大胖...', 'user': 'xiaopang', 'parent_id': 6},]

第一种方法:在后端利用递归实现评论数据结构:

#第一种方法,用递归实现评论数据结构
class Node(object):@staticmethoddef Recursive(ret,row):for cr in ret:if row['parent_id'] == cr['id']:row['childen'] = []cr['childen'].append(row)returnelse:Node.Recursive(cr['childen'],row)@staticmethod   #静态方法,函数中并没有封装东西,Node.create_tree即可调用def create_tree(comment_list):ret = []for row in comment_list:if row['parent_id'] == None:row['childen'] = []ret.append(row)else:#注释部分为思路,一层一层的创建下去,引申到递归# for i in ret:#     if row['parent_id'] == i['id']:#         row['childen'] = []#         i['childen'].append(row)#     else:#         passNode.Recursive(ret,row)return ret
def comment(request):"""每条新闻下面有评论,然后评论之间可以互相评论,这让评论之间出现了层级的关系。所以我们需要将列表重新组合一下,使得以及品论存储着二级评论"""comment_list = [{'id': 1, 'content': 'Python最牛逼', 'user': '搞基建', 'parent_id': None},{'id': 2, 'content': 'Java最牛逼', 'user': '搞基建', 'parent_id': None},{'id': 3, 'content': 'PHP最牛逼', 'user': '搞基建', 'parent_id': None},{'id': 4, 'content': '你最牛逼', 'user': '小比虎', 'parent_id': 1},{'id': 5, 'content': '老师最你比', 'user': '李欢', 'parent_id': 1},{'id': 6, 'content': '郭永昌是...', 'user': '郭永昌', 'parent_id': 4},{'id': 7, 'content': '哈哈我是流氓...', 'user': '崔月圆', 'parent_id': 2},{'id': 8, 'content': '我女朋友好漂亮...', 'user': '崔月圆', 'parent_id': 3},{'id': 9, 'content': '见到你女友,交定你朋友...', 'user': '搞基建', 'parent_id': 8},{'id': 10, 'content': '见到你女友,交定你朋友...', 'user': '鼻环', 'parent_id': None},{'id': 11, 'content': '我是大胖...', 'user': 'xiaopang', 'parent_id': 6},]comment_tree = Node.create_tree(comment_list)print(comment_tree)print(ret)import jsonreturn HttpResponse(json.dumps(ret))

第二种方法:利用循环实现评论数据结构:

#第二种,用循环实现评论数据结构ret = []comment_list_dict = {}# for i in comment_list:#     i.update({'childen':[]})## for item in comment_list:#     if item['parent_id'] == None:#         ret.append(item)#     else:#         for i in comment_list:#             if i['id'] == item['parent_id']:#                 i['childen'].append(item)# print(ret)#对第二种方法的改版for i in comment_list:i.update({'childen':[]})comment_list_dict[i['id']] = ifor item in comment_list:if item['parent_id'] == None:ret.append(item)else:comment_list_dict[item['parent_id']]['childen'].append(item)print(ret)

配置好views

def index(request):return render(request,'index.html')

利用JS递归,在前端显示层级评论

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.comment-box{margin-left: 20px;}</style></head>
<body><div class="item"><a news_id = "1" class="com">评论</a>
</div><script src="/static/jquery-3.3.1.js"></script><script>$(function () {bindCommentEvent();});function Recursive(childen_list) {var html = '';$.each(childen_list,function (ck,cv) {var b = '<div class="comment-box"><span>';b += cv.content;b += "</span>";var result1 = cv.childen;b += result1;b+= "</div>";html += b;});return html;}function create_tree(data,_this) {var html = '<div class="comment-list">';$.each(data,function (k,v) {var a = '<div class="comment-box"><span>';a += v.content;a += "</span>";{#            //创建自评论,利用递归实现,这里创将第二层方便理解#}var result1 = Recursive(v.childen);
{#             $.each(v.childen,function (ck,cv) {#}
{#                var b = '<div class="comment-box"><span>';#}
{#                b += cv.content;#}
{#                b += "</span>";#}
{#                b+= "</div>";#}
{#                a += b;#}
{#             });#}a += result1;a += "</div>";html += a;});html +="</div>";_this.append(html)}function bindCommentEvent() {$('.com').click(function () {var news_id = $(this).attr('nes_id');var _this = $(this);$.ajax({url:'/comment/',type: 'GET',data:{'news_id':news_id},dataType:"JSON",success:function (arg) {
{#                    console.log(arg);#}create_tree(arg,_this);}})})}</script></body>
</html>

效果预览:

备战秋招——记录自己学习的第六天(Django项目难点拆分——层级评论数据结构实现)相关推荐

  1. [静态时序分析简明教程(三)]备战秋招,如何看懂一个陌生的timing report

    备战秋招,如何看懂一个陌生的timing report 一.写在前面 1.1 快速导航链接· 二.Timing Report 2.1 起始点与终止点 2.2 路径时钟域的归属 2.2 建立时间检查与保 ...

  2. 研二非科班研究生如何备战秋招

    持续坚持原创输出,点击蓝字关注我吧 作者:软件质量保障 知乎:https://www.zhihu.com/people/iloverain1024 ​最近知乎收到了一位研二非科班同学的付费咨询,让我帮 ...

  3. 备战秋招 |《百面机器学习》算法+leetcode开班报名!

    算法面试刷题班推荐: 以<百面机器学习>为教材 结合leetcode筛选刷题 秋招已经开始了!时间紧迫,也许别人已经得到offer了,你却还在不知所措?(文末重金招聘讲师) 六月份基本都是 ...

  4. Github | 备战秋招,最全面试题集合!

    最近很多大厂已经开始开始了校招提前批,2020届的同学们可以赶紧启动啦-社招的情况也不容乐观,除了之前的一大波裁员新闻,现在更多的是收紧HC,做人才盘点,各个厂的HC不会像以前那么多了.我在Githu ...

  5. 如何备战秋招,找到满意的工作(转B站狂神)

    1.何为秋招? 1.1.应届生 暑假:大学生(实习.工作) 8月.春招! 应届毕业生! 2015年级 2019界 2016年级 2020界 应届毕业生: 大三升大四! 大三暑假找工作找实习! 大四:毕 ...

  6. 秋招记录总结---加油,陌生人

    秋招记录总结-加油,陌生人 首先,自我介绍: 关键词:郑州.双非渣本.男生.22届.Java后端 很幸运,可以在秋招期间,获得了 阿里.快手.滴滴 三个offer 对比很多大佬来说,我的offer可能 ...

  7. 【秋招备战计划第一弹】今天就开始备战秋招

    写在最前面吧 这是一个纯 从自身经历和能力出发的个人分析案列 不具备普适性 个人标签 大三 - 2022届 - 双非本科 - Java后端开发 思维导图 上了 牛客热榜 蛮不错的 已经过去的春招 简单 ...

  8. 校招|我的秋招记录——(自然语言处理-面经+感悟)

    作者:Haitons 链接:https://www.nowcoder.com/discuss/348316 来源:牛客网 回忆这东西若是有气味的话,那就是樟脑的香 ----谨以此文记录我的2019秋招 ...

  9. 秋招之后的学习java心得

    2021.3.20投出第一份实习简历,5.28收到华为实习意向书.8月12日实习离职开始投递秋招,期间边面试边查缺补漏,算法能力.面经八股文以及项目经验都在这个过程中不断提高,最终收获了几个比较满意的 ...

最新文章

  1. 从1到10排序的C语言程序,C语言:用冒泡法从高到低排序10 个数,然后进行反排序...
  2. Linux时间同步+国内常用的NTP服务器地址
  3. RHEL5中配置无线
  4. jQuery 如何ajax
  5. BZOJ 2179 [快速傅里叶变换 高精度乘法]
  6. 外围功能电路控制 LET′S TRY“嵌入式编程”: 4 of 6
  7. vscode编辑python_VSCode+Python开发环境
  8. 在python3中如何加载静态文件详版步骤
  9. mysql ip v4 v6_mysql IPv4 IPv6
  10. 设计模式之单例模式8种实现方式,其六:双重检查
  11. 2018软工第六次作业
  12. Rust: 如何读写中文字符?
  13. deeping操作系统修改已挂载卷名称
  14. meshlab点云转mesh
  15. ArcGIS网络分析之中国邮递员问题
  16. 医学影像工作站 v2.2 官方
  17. android源码下载及编译
  18. python模拟商家抹零行为_2019-04-10
  19. python中字符串和文本处理(很详细)
  20. centos7下vim的开箱使用与简单配置分享

热门文章

  1. div+css静态网页设计:三亚旅游网站设计——三亚旅游网页设计(6页) html网页设计期末大作业_网页设计平时作业
  2. 放大电路的静态工作点
  3. 坐标系统投影变换分带方法
  4. 联通iphone4新政,粗暴挟制用户不应该
  5. 智牛股_第4章_Nacos+Ceph分布式存储+Netty通讯
  6. ALTIUM DESIGNER+KEYSHOT快速渲染电路板
  7. HTTP 协议相关入门
  8. C语言第五章实验原理,C语言第五章实验报告.docx
  9. Deepfake版阿汤哥,在海外版抖音上收获了32万粉丝
  10. UGA5TBYB_E_USG.exe