评论楼

从数据库中取出本篇博客的所有评论
使用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. Maven 项目生成jar运行时提示“没有主清单属性”

    新建了一个Maven的项目,mvn compile和mvn package后生成了jar文件,然后直接到target目录下去执行java -jar xxx.jar命令运行jar包时出现了"x ...

  2. python import自定义模块方法

    转自:http://www.cnitblog.com/seeyeah/archive/2009/03/15/55440.html python包含子目录中的模块方法比较简单,关键是能够在sys.pat ...

  3. Algorithm --> n位数去掉k位后找最小数

    去掉K位求取最小数 一个n位的数,去掉其中的k位,怎样使留下来的(n-k)位数按原来的前后顺序组成的数最小 例如 8314925去掉4个数,留下125最小,注意有前后顺序要求,要是没有顺序当然是123 ...

  4. C语言的输入输出操作函数小结

    一.scanf()&printf()函数 scanf() 函数用于从标准输入(键盘)读取并格式化, printf() 函数发送格式化输出到标准输出(屏幕).  scanf()函数原型为int ...

  5. grep -vFf 比较2个文件差异

    grep -vFf 1.txt 2.txt   打印出2.txt中与1.txt有差异的数据. #cat .txt 192.168.0.1 192.168.0.2 192.168.0.3 #cat .t ...

  6. 数据库 用SQL语句操作数据

    ACCP 马天鹏 2017/10/20 14:33:07用SQL语句操作数据. SQL的组成:(1)DML(Data Manipiation Language ,数据操作语言,)用来插入,修改和删除数 ...

  7. Java基础学习笔记二十一 多线程

    多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...

  8. CountDownLatch 源码解析—— await()

    上一篇文章说了一下CountDownLatch的使用方法.这篇文章就从源码层面说一下await() 的原理. 我们已经知道await 能够让当前线程处于阻塞状态,直到锁存器计数为零(或者线程中断). ...

  9. 201621123060《JAVA程序设计》第十周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...

  10. 201621123068 Week03-面向对象入门

    1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1.1 写出你 ...