多级评论的实现
admin
2023-07-20 00:01:49
0次

第一种:

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 += "
" % margin_left_val + k.name + "" + "

' # html += "
" % margin_left_val + k.text + "
" # 有可能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 = "
    " # 规定一个margin left,每次有递归的时候就往右缩进一点。 margin_left = 0 # 对comment_dic中的每一组元素进行操作 for k,v in comment_dic.items(): # 第一层html html += "
  • " + k.name + "" + "
  • ' # 通过递归把他的儿子加上 html += generate_comment_html(v, margin_left+35) # 最后把ul关上 html += "
" # 关掉转义 return mark_safe(html)

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...