利用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中的二进制位运算符
May 13 Python
Python分析学校四六级过关情况
Nov 22 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 Python
Centos7 Python3下安装scrapy的详细步骤
Mar 15 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
Python读取txt某几列绘图的方法
Oct 14 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
python中tab键是什么意思
Jun 18 Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 Python
如何利用pygame实现打飞机小游戏
May 30 Python
python 经纬度求两点距离、三点面积操作
Jun 03 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/29 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
2015/01/07 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
PHP SOCKET编程详解
2015/05/22 PHP
ThinkPHP模型详解
2015/07/27 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
event对象的方法 兼容多浏览器
2009/06/27 Javascript
JavaScript简介
2015/02/15 Javascript
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
python网络编程实例简析
2014/09/26 Python
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
对python 读取线的shp文件实例详解
2018/12/22 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
python 判断一组数据是否符合正态分布
2020/09/23 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
中英文自我评价常用句型
2013/12/19 职场文书
财务管理职业生涯规划范文
2013/12/27 职场文书
汽车机修工岗位职责
2014/03/06 职场文书
中秋寄语大全
2014/04/11 职场文书
日语专业毕业生自荐书
2014/06/18 职场文书
秋菊打官司观后感
2015/06/03 职场文书
python使用glob检索文件的操作
2021/05/20 Python
pytorch 如何使用float64训练
2021/05/24 Python
解析python中的jsonpath 提取器
2022/01/18 Python
muduo TcpServer模块源码分析
2022/04/26 Redis