利用Django模版生成树状结构实例代码


Posted in Python onMay 19, 2019

前言

我们经常会有这样的需求,比如评论功能,每个评论都有可能会有自己的子评论,如果在界面只展示成一列的话非常不美观,也不能体现出他们的层级关系。那么我们今天就来看看如何使用Django的模版来生成树状结构,以本站为例,效果如下图所示:

利用Django模版生成树状结构实例代码

那么我们要怎么实现呢?首先先看看评论实体的定义,如下所示:

class Comment(models.Model):
 body = models.TextField('正文', max_length=300)
 author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='作者', on_delete=models.CASCADE)
 article = models.ForeignKey(Article, verbose_name='文章', on_delete=models.CASCADE)
 parent_comment = models.ForeignKey('self', verbose_name="上级评论", blank=True, null=True, on_delete=models.CASCADE)

可以看到,有一个parent_comment字段,关联自己。这样就可以根据这个字段来生成层级关系。 为了方便我们使用,我们自定义了一个叫query的tag,也可以叫修饰器。定义tag的代码如下,tag的定义应该定义在app/templatetags目录下,这里py文件命名为blog_tags.py:

@register.simple_tag
def query(qs, **kwargs):
 """ template tag which allows queryset filtering. Usage:
   {% query books author=author as mybooks %}
   {% for book in mybooks %}
   ...
   {% endfor %}
 """
 return qs.filter(**kwargs)

接下来下面这段代码是树节点的模版代码。

{% load blog_tags %}
{% load comments_tags %}
 <div id="commentlist-container" class="comment-tab" style="display: block;">
    <ol class="commentlist">
     {% query article_comments parent_comment=None as parent_comments %}
     {% for comment_item in parent_comments %}
      {% with 0 as depth %}
       {% include "comments/tags/comment_item_tree.html" %}
      {% endwith %}
     {% endfor %}
    </ol>
   </div>

其中的{% query article_comments parent_comment=None as parent_comments %}的功能就是从评论中筛选出来是父级的评论。 comment_item_tree.html的实现也很简单:

{% load blog_tags %}
<li class="comment even thread-even depth-{{ depth }} parent" id="comment-{{ comment_item.pk }}"
 style="margin-left: {% widthratio depth 1 3 %}rem">
 <div id="div-comment-{{ comment_item.pk }}" class="comment-body">
  <div class="comment-meta commentmetadata">
   {{ comment_item.created_time }}
  </div>
  <p>{{ comment_item.body |escape|custom_markdown }}</p>
  <div class="reply"><a class="comment-reply-link"
        href="javascript:void(0)" rel="external nofollow" 
        onclick="do_reply({{ comment_item.pk }})"
        aria-label="回复给{{ comment_item.author.username }}">回复</a></div>
 </div>

</li><!-- #comment-## -->
{% query article_comments parent_comment=comment_item as cc_comments %}
{% for cc in cc_comments %}
 {% with comment_item=cc template_name="comments/tags/comment_item_tree.html" %}
  {% with depth=depth|add:1 %}
   {% include template_name %}
  {% endwith %}
 {% endwith %}
{% endfor %}

其中最主要的部分就是</li>标签后面那段。这里使用with和include配合来在每一次循环里面重复的引入comment_item_tree.html,并且每次引入时赋予当前的评论变量和depth(每层循环depth会+1)。然后在每个评论处使用style="margin-left: {% widthratio depth 1 3 %}rem"来实现缩进,这样就实现了树状显示。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
python+selenium+autoit实现文件上传功能
Aug 23 Python
Python排序搜索基本算法之堆排序实例详解
Dec 08 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
TensorFlow中权重的随机初始化的方法
Feb 11 Python
python 将数据保存为excel的xls格式(实例讲解)
May 03 Python
python解析含有重复key的json方法
Jan 22 Python
浅析Python 引号、注释、字符串
Jul 25 Python
Python字符串hashlib加密模块使用案例
Mar 10 Python
浅析python连接数据库的重要事项
Feb 22 Python
利用python实现汉诺塔游戏
Mar 01 Python
python数据可视化JupyterLab实用扩展程序Mito
Nov 20 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 #Python
python反编译学习之字节码详解
May 19 #Python
python从入门到精通 windows安装python图文教程
May 18 #Python
详解用Python实现自动化监控远程服务器
May 18 #Python
Python实现打砖块小游戏代码实例
May 18 #Python
如何在Python中实现goto语句的方法
May 18 #Python
OpenCV搞定腾讯滑块验证码的实现代码
May 18 #Python
You might like
基于mysql的论坛(6)
2006/10/09 PHP
php生成curl命令行的方法
2015/12/14 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
json数据与字符串的相互转化示例
2013/09/18 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
基于JavaScript实现div层跟随滚动条滑动
2016/01/12 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
原生JS轮播图插件
2017/02/09 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
express默认日志组件morgan的方法
2018/04/05 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
Python基础语法(Python基础知识点)
2016/02/28 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
Python 求向量的余弦值操作
2021/03/04 Python
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
交通安全教育制度
2014/02/02 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
高三励志标语
2014/06/05 职场文书
员工自我评价范文
2015/03/11 职场文书
《所见》教学反思
2016/02/23 职场文书
初中政治教学反思
2016/02/23 职场文书
Win11开始菜单添加休眠选项
2022/04/19 数码科技