利用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 相关文章推荐
Python常用的爬虫技巧总结
Mar 28 Python
Python切换pip安装源的方法详解
Nov 18 Python
Request的中断和ErrorHandler实例解析
Feb 12 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
用Python shell简化开发
Aug 08 Python
python使用scrapy发送post请求的坑
Sep 04 Python
python使用suds调用webservice接口的方法
Jan 03 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
Feb 14 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
让你的Python代码实现类型提示功能
Nov 19 Python
keras 简单 lstm实例(基于one-hot编码)
Jul 02 Python
详解python方法之绑定方法与非绑定方法
Aug 17 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
PHP中extract()函数的妙用分析
2012/07/11 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
PHP计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
PHP生成条形图的方法
2014/12/10 PHP
php将金额数字转化为中文大写
2015/07/09 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
tagName的使用,留一笔
2006/06/26 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
Vuepress 搭建带评论功能的静态博客的实现
2019/02/17 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
python列表操作之extend和append的区别实例分析
2015/07/28 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
python 生成图形验证码的方法示例
2018/11/11 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
用python实现学生管理系统
2020/07/24 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
2021/02/01 Python
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
秋季运动会稿件
2014/01/30 职场文书
运动会口号大全
2014/06/07 职场文书
副总经理党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/06 职场文书
介绍信样本
2015/01/31 职场文书
python析构函数用法及注意事项
2021/06/22 Python
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis