利用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 相关文章推荐
pyqt4教程之实现半透明的天气预报界面示例
Mar 02 Python
python迭代器与生成器详解
Mar 10 Python
node.js获取参数的常用方法(总结)
May 29 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
Python操作Oracle数据库的简单方法和封装类实例
May 07 Python
python并发和异步编程实例
Nov 15 Python
python利用requests库模拟post请求时json的使用教程
Dec 07 Python
python爬虫之自制英汉字典
Jun 24 Python
Python PyCharm如何进行断点调试
Jul 05 Python
django美化后台django-suit的安装配置操作
Jul 12 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
Jan 12 Python
Python Pandas 删除列操作
Mar 16 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版网站缓存加快打开速度的方法分享
2012/06/03 PHP
php二维数组合并及去重复的方法
2015/03/04 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
php基于环形链表解决约瑟夫环问题示例
2017/11/07 PHP
Js sort排序使用方法
2011/10/17 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
js时间日期格式化封装函数
2014/12/02 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
Python发送email的3种方法
2015/04/28 Python
Python中pip安装非PyPI官网第三方库的方法
2015/06/02 Python
Python使用flask框架操作sqlite3的两种方式
2018/01/31 Python
opencv python 傅里叶变换的使用
2018/07/21 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
python爬虫使用requests发送post请求示例详解
2020/08/05 Python
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
岗位职责风险防控
2014/02/18 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
质量承诺书怎么写
2014/05/24 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
思想作风建设心得体会
2014/10/22 职场文书
民主评议政风行风活动心得体会
2014/10/29 职场文书
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
2021/05/29 MySQL
redis的list数据类型相关命令介绍及使用
2022/01/18 Redis