comment_list=models.Comment.objects.filter(news_id=new_id)
ret=[] # 最终拿到的数据
comment_list_dict={} # 构建的中间字典
for row in comment_list: # 通过查到的数据中的id作为key,每一行数据作为value生成一个字典
row.update({"children":[]}) # 构建一个键children对应一个空列表
comment_list_dict[row["id"]]=row # 将id作为键,当前行作为值存到该字典中
for item in comment_list: # 遍历一遍取到的数据列表
parrent_row=comment_list_dict.get(item["parent_id"]) # 拿到当前行对应的父亲的地址
if not parrent_row: # 如果父亲是None,则直接进入ret中
ret.append(item)
else: # 否则,将这行append到父亲的children中
parrent_row["children"].append(item) # 重点在这一行,用到了上面提到的第一个知识点
print(ret)
from django.utils.safestring import mark_safe
# 递归查找父节点
def find_father(dic, comment_obj):
# 对字典中的每一组元素进行循环操作
for k, v_dic in dic.items():
# 如果k等于comment_obj的父节点,那么表示找到了父亲。
if k == comment_obj.parent_comment:
# 找到了父亲,认祖归宗,把自己归位到父亲下面,并给将来的儿子留个位置
dic[k][comment_obj] = {}
# 找到了父亲,处理完毕,返回
else:
# 刚才没找到,剥一层,接着往下找。
find_father(dic[k], comment_obj)
# 递归生成html字符串
def generate_comment_html(sub_comment_dic, margin_left_val):
# 先创建一个空字符串
html = ""
# 对传入的字典进行循环操作
for k, v_dic in sub_comment_dic.items():
html += "<div style='margin-left:%spx'><span class='nickname'>" % margin_left_val + k.name + "</span>" + "<time class='submit-date'>" + str(k.created_time.strftime('%Y-%m-%d %H:%M:%S')) + "<div class='text'>" + k.text + '</div></div><hr>'
# html += "<div style='margin-left:%spx' class='comment-node'>" % margin_left_val + k.text + "</div>"
# 有可能v_dic中依然有元素, 递归继续加
if v_dic:
html += generate_comment_html(v_dic, margin_left_val+35)
# 循环完成最后返回html
return html
# 生成层级评论
@register.simple_tag
def build_comment_tree(comment_list):
# 定义一个空字典用来保存转换之后的结果
comment_dic = {}
# 对comment_list中的每个元素进行循环
for comment_obj in comment_list:
# 判断comment_obj是否存在父节点。如果没有,这把该评论作为第一个节点
if comment_obj.parent_comment is None:
comment_dic[comment_obj] = {}
else:
# 否则去找该对象的父节点。
find_father(comment_dic, comment_obj)
# 上面执行完毕,comment_dic中会有转换好的结果
# 开始拼接html字符串
html = "<ul class='comment-list list-unstyled'>"
# 规定一个margin left,每次有递归的时候就往右缩进一点。
margin_left = 0
# 对comment_dic中的每一组元素进行操作
for k,v in comment_dic.items():
# 第一层html
html += "<li class='comment-item'><span class='nickname'>" + k.name + "</span>" + "<time class='submit-date'>" + str(k.created_time.strftime('%Y-%m-%d %H:%M:%S')) + "<div class='text'>" + k.text + '</div></li>'
# 通过递归把他的儿子加上
html += generate_comment_html(v, margin_left+35)
# 最后把ul关上
html += " </ul>"
# 关掉转义
return mark_safe(html)
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
为盈江等地区用户提供了全套网页设计制作服务,及盈江网站建设行业解决方案。主营业务为网站设计制作、网站制作、盈江网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
网页名称:多级评论的实现-创新互联
URL标题:https://www.cdcxhl.com/article42/pihhc.html
成都网站建设公司_创新互联,为您提供电子商务、网站排名、企业建站、服务器托管、标签优化、网站营销
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联