评论楼

从数据库中取出本篇博客的所有评论
使用python语句将评论整理成具有层级关系的列表

typename=request.POST.get('typename')
comment_list = models.comment.objects.filter(article_id=int(typename)).values("id", "content",
"user__nickname", "parent_id_id")
comment_dict = {}
for item in comment_list:
item["child"] = []
comment_dict[item['id']] = item
comment = []
for item in comment_list:
pid = item["parent_id_id"]
if pid:
comment_dict[pid]["child"].append(item)
else:
comment.append(item)

  

方式一:

后台生成html字符串(递归函数)

def comment_tree(comment_list):
# [{'child': [{'child': [{'child': [], 'user__nickname': 'egon', 'content': '哪里不好啊', 'create_time': None, 'id': 3, 'parent_id': 2}],
# 'user__nickname': 'sever', 'content': '扯淡', 'create_time': None, 'id': 2, 'parent_id': 1}],
# 'user__nickname': 'egon', 'content': '写的太好了', 'create_time': None, 'id': 1, 'parent_id': None},
# {'child': [], 'user__nickname': 'root', 'content': '写的不错', 'create_time': None, 'id': 4, 'parent_id': None},
# {'child': [], 'user__nickname': 'alex', 'content': '我写的真好', 'create_time': None, 'id': 5, 'parent_id': None}] comment_str="<div class='comment'>"
for row in comment_list:
tpl="<div class='content'>%s:%s --- %s</div>"%(row['user__nickname'],row['content'],row['create_time'])
comment_str += tpl
if row['child']: child_str=comment_tree(row['child'])
comment_str += child_str
comment_str += '</div>'
return comment_str

方式二:

前端生成页面加载完成之后发送ajax请求

js 函数递归
字符串格式化

$.ajax({
url:'/comment.html',
data:{'typename':{{ article.article.aid }},'csrfmiddlewaretoken':'{{ csrf_token }}'},
type:'post',
dataType:'JSON',
success:function (data) {
var comment=commentTree(data);
$('.commentarea').append(comment)
}
}); {# var nn =new Date;#}
{# nn.getDate() ;#}
/*
前端 调用对象方法时,是通过调用类的propotype中的方法
正则表达式:/\w+/g
字符串replace
''.replace(/(\w+)/g,function(k,kk){return 11})
*/ String.prototype.Format=function(arg){ /*
this 当前字符串
arg format方法传入的参数{key:value}
return 格式化之后获取的新内容
*/ var temp=this.replace(/\{(\w+)\}/g,function(k,kk){
return arg[kk];
});
return temp;
}; function commentTree(comment_list){
var comment_str="<div class='comment'>";
$.each(comment_list,function(k,row){
var temp="<div class='content'>{user}{content}---{time}</div>";
var temp1=temp.Format({user:row.user__nickname,content:row.content,time:row.create_time});
comment_str += temp1;
if(row.child.length>0){
comment_str += commentTree(row.child);
}
});
comment_str += "</div>";
return comment_str
}

  

多级评论在前端页面进行递归
class JsonCustomEncoder(json.JSONEncoder):
def default(self, field):
if isinstance(field, datetime):
return field.strftime('%Y-%m-%d %H:%M:%S');
elif isinstance(field, date):
return field.strftime('%Y-%m-%d');
else:
return json.JSONEncoder.default(self, field); def commcnts(request,nid):
response={'status':True,'data':None,'mag':None}
print('is nid...',nid)
try:
comment_list=models.Comment.objects.filter(article_id=nid).values(
"nid", "reply_id", "user__nid",
"user__nickname", "create_time", "content",
"reply__user__nickname",
)
# 连表查询内容
comment_list_dict = {}
# 定一个空字典
for item in comment_list:
#循环连表获取到的内容
item['child'] = []
# 给循环的每一个字典添加一个空列表
comment_list_dict[item['nid']] = item
#给新创建的字典添加一对数据,键是循环的字典里的每一个id 值是循环的每一个字典 result = []
# 定一个空列表
for item in comment_list:
# 循环连表获取到的内容
pid = item['reply_id']
# 拿到每个字典reply_id键对应的值赋值给变量
if pid: # 如果pid为True
comment_list_dict[pid]['child'].append(item)
#刚刚判断回复的id有值,就把回复有值字典添加comment_lsit_dict字典的child键对应的列表中
else: # 为None
result.append(item) # result结果增加没有孩子的字典
response['data'] = result
# 重写response字典data的值,值更换为刚刚得到的新的字典
print('is result',result)
except Exception as e:
# 捕捉异常
response['status'] = False
# 如果有异常就重写response字典的status键对应的值,值更改为False
response['msg'] = str(e)
#如果有异常就重写response字典的msg键对应的值,值更改为捕捉到的异常信息
return HttpResponse(json.dumps(response, cls=JsonCustomEncoder))
# 返回一个字符串返回的有response的内容和一个类和对象 {#==================================定一个函数添加评论楼的信息============================#}
function commentTree(comment_list) {
{#定义一个函数,这个函数的参数 comment_list 是在被调用时( var comment = commentTree(arg.data);)arg.data传值过来的#}
var comment_str = "<div class=comment>";
{#定一个自变量,内容是字符串#}
$.each(comment_list, function (k,row) {
{#循环一下 comment_list 列表 分别拿到索引和参数,函数中只写一个的时候获取到的是索引值#}
{# var temp = "<div class='content'>" + row.content + "</div>";#}
console.log(comment_list);
var temp = "<div class='content'>{user}-{content}--{time}</div>";
{#定一个变量,内容是字符串但是有机个字符占位符#}
var temp1 = temp.Format({ user:row.user__nickname, content:row.content, time: row.create_time});
{#定一个一个变量接受刚刚定义的变量格式化的内容#}
comment_str += temp1;
{#每循环一次都把得到的内容添加到 comment_str 变量中#}
{# comment_str += temp;#}
if (row.child.length > 0) {
{#通过row.child 每次循环的字典中的孩子长度判断孩子存不存在#}
comment_str += commentTree(row.child)
{#孩子存在的就进行递归的查找和添加#}
}
}); comment_str += '</dic>';
{#在循环完以后在给变量设置一个div的结束标签#}
return comment_str
{#最后把得到字符串变量返回#}
}

  

多级评论在后端页面进行递归

comment_list = models.Comment.objects.filter(article_id=user_id).values(
"nid", "reply_id", "user__nid",
"user__nickname", "create_time", "content",
"reply__user__nickname"
)
print('is comment_list',comment_list) comment_list_dict = {}
for item in comment_list:
item['child'] = []
comment_list_dict[item['nid']] = item print(comment_list_dict)
result = []
for item in comment_list:
pid = item['reply_id']
if pid: # 如果pid为True
comment_list_dict[pid]['child'].append(item)
else: # 为None
result.append(item) # result结果增加item from check.comment import comment_tree
comment_str = comment_tree(result)
caregory_list, tag_lsit, time_list, article_list, fen, guanzhu, users_list = fiflers(request, blog)
print('title,user_id',title,user_id)
xx=models.ArticleDetail.objects.filter(id=user_id)
print(xx) return render(request,'xiangxi.html',{
'xx':xx,
'caregory_list': caregory_list,
'tag_lsit': tag_lsit,
'time_list': time_list,
'article_list': article_list,
'fen': fen,
'guanzhu': guanzhu,
'users_list': users_list,
'blog':blog,
'user_id':user_id,
"comment_str":comment_str
})

  

python 评论楼的更多相关文章

  1. python全栈开发day80--评论楼、评论树

    内容总结: 1. 内容回顾 1. 内容回顾 1.评论 1. 展示评论 1. 评论楼(Django模板语言渲染) 1. 从后端查询出所有的评论 2. 如果有父评论就展示父评论 2. 评论树 通过ajax ...

  2. python之路1

    python之路 http协议 html HTML2 CSS选择器 CSS属性操作 CSS属性操作/下 JavaScript(js)/上 JavaScript的对象 JavaScript的对象/下 前 ...

  3. Python知识目录

    目录 一.计算机基础 二.Python基础 三.函数 四.常用模块 五.模块和包 六.面向对象 七.网络编程socket 八.数据库 九.前端 十.Python Web框架 十一.版本控制--GIT ...

  4. python全栈开发day78、79 --bss项目

    一.回顾 1. BBS项目 CMS 1. 登录 1. form组件 2. auth模块 3. 验证码 2. 注册 1. form组件 1. 生成html代码 直接for循环form_obj,就能够遍历 ...

  5. 【Python全栈-后端开发】Django进阶之Model操作复习

    Django进阶之Model操作复习 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - ...

  6. python学习目录(转载)

    python基础篇 python 基础知识    python 初始python    python 字符编码    python 类型及变量    python 字符串详解 python 列表详解 ...

  7. bbs项目实现点赞和评论的功能

    一.点赞功能 思路是这样的: 1.对点赞和踩都设置一个相同的class,然后对这个class绑定点击事件 2.点击触发ajax请求,我们对赞的标签设置了一个class属性,对踩的标签没有设置这个cla ...

  8. Django实现文章按年月归档、点赞和评论、发送邮件

    文章归档的实现 我们在创建文章时,会在数据库中存储文章创建的时间这样的字段,一般用的都是datetime类型,记录文章创建的年月日和时分秒,所以我们直接使用文章的创建时间分类是无法实现文章的按年月归档 ...

  9. ajax评论

    评论有好几种格式:有评论树.评论楼等的格式 发表评论注意事项: 1. 展示评论 1. 评论楼(Django模板语言渲染) 1. 从后端查询出所有的评论 2. 如果有父评论就展示父评论 2. 评论树 通 ...

随机推荐

  1. Linux设备驱动故障定位指引与实例

    Linux设备驱动故障定位指引 Linux设备驱动种类繁多,涉及的知识点多,想写一个通用的故障定位方法指引,是个难度颇大且不容易做好的工作.限于笔者的经验,难以避免存在疏漏之处,欢迎大家留言指正补充. ...

  2. C语言最后一次作业--总结报告

    1.当初你是如何做出选择计算机专业的决定的? 经过一个学期,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 当时选择计算机专业,是基于自己的高考分数和想出省的 ...

  3. intellij IDEA配置Tomcat

    第一步:点击上方File选项找到Setting,在文本框中输入Tomcat,找到之后点击右下角的OK 第二步:再次找到Setting,在文本框中输入Application Servers找到后,单击 ...

  4. python统计词频

    arr = [1,2,3,4,5,6,4,5,2,3,6,8,9,6,5,3,6,2,4]dic={}for item in arr: if item in dic.keys(): dic[item] ...

  5. sublime安装、注册、插件

    1. sublime下载:http://www.sublimetext.com/3 2. 输入注册码: help->Enter License —– BEGIN LICENSE —– Antho ...

  6. 【Python】 Selenium 模拟浏览器 寻路

    selenium 最开始我碰到SE,是上学期期末,我们那个商务小组做田野调查时发的问卷的事情.当时在问卷星上发了个问卷,但是当时我对另外几个组员的做法颇有微词,又恰好开始学一些软件知识了,就想恶作剧( ...

  7. mariadb插入中文数据乱码解决过程

    基本情况: 系统:centos 7 mariadb安装方式:yum 乱码解决过程: 查看当前数据库编码(登录数据库后) # show variables like 'character%'; (上图为 ...

  8. LeetCode --> 771. Jewels and Stones

    Jewels and Stones You're given strings J representing the types of stones that are jewels, and S rep ...

  9. DotNetBar控件,superTabControl多文档界面(MDI)的风格、多Tab的创建方法

    最近在做一个条码系统的项目,第一次用dotnetbar控件,,查找资料时看到伍老师一篇文章(链接),但是没有关于加载tab窗口的方法,自己摸索做了一个此类风格出来,并写了一个通用方法,供大家参考. 风 ...

  10. ReflectASM-invoke,高效率java反射机制原理

    前言:前段时间在设计公司基于netty的易用框架时,很多地方都用到了反射机制.反射的性能一直是大家有目共睹的诟病,相比于直接调用速度上差了很多.但是在很多地方,作为未知通用判断的时候,不得不调用反射类 ...