评论楼

从数据库中取出本篇博客的所有评论
使用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. Java I/O 总结

    Java I/O的的架构使用了装饰器的模式,我们在使用流的时候需要新建很多的装饰器对象,对源数据进行层层包装.各个包装类名以及它们的应用场景比较多,初学的时候难以摸清规律,这里我把它们归一下类,方便大 ...

  2. MAVEN打包报错:com.sun.net.ssl.internal.ssl;sun.misc.BASE64Decoder;程序包 javax.crypto不存在处理办法

    以下是pom.xml里面的完整配置,重点是红色的部分,原因是引用的jar是jre下边的,而打包环境用的是jdk下边的jar,所以引用下就OK了.<build> <plugins> ...

  3. Java基础笔记(7)----三个修饰符

    abstract抽象 方法 抽象方法:abstract修饰的方法,只有声明 而没有方法的实现(连{}都没有). 语法:修饰符 返回值类型 方法名(形参列表); 注意:抽象方法 必须定义在 抽象类中. ...

  4. 阿里聚安全·安全周刊】一种秘密窃取数据的新型 Android 木马|iOS 11相机惊现BUG

    本周的七个关键词:  新型 Android 木马丨 TLS 1.3 丨  阿里安全图灵实验室 丨 漏洞感染 Linux 服务器 丨 CPU曝极危漏洞 丨   iOS 11相机BUG 丨R2D2技术 - ...

  5. shell随机生成身份证,姓名,电话,日期,分数,等级和insert语句

    #!/bin/bash#生成随机身份证号,性别,年龄,电话,姓名,日期,分数和对应等级,并生成insert语句#作者AiYS,2018-02-06,转载请注明http://www.cnblogs.co ...

  6. nodejs安装和卸载

    Ubuntu 上安装 Node.js 方式一:直接安装    一.安装 1.$ sudo apt-get install nodejs2.$ sudo apt-get install npm二.升级 ...

  7. 2017-2018-1 20155215 第五周 mybash的实现

    题目要求 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解,实现过程和问题解决的博客(包含代码托管链接) 学习fork,exec,wait fork ma ...

  8. 项目Alpha冲刺Day6

    一.会议照片 二.项目进展 1.今日安排 熟悉后台框架并编写.继续搭建前台框架模版.熟悉前端框架开发流程.完成前端热部署配置.完成部分后台用户信息相关接口.解决后台jdk1.8日期在框架中的使用. 2 ...

  9. 学号:201621123032 《Java程序设计》第13周学习总结

    1:本周学习总结 2:为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 2.1:简述你想为你的系统增加什么网络功能?设计思路是什么? 创建了一个服务器监听8080端口,通过网络助手客户 ...

  10. python每日一函数 - divmod数字处理函数

    python每日一函数 - divmod数字处理函数 divmod(a,b)函数 中文说明: divmod(a,b)方法返回的是a//b(除法取整)以及a对b的余数 返回结果类型为tuple 参数: ...