利用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  连接字符串(join %)
Sep 06 Python
Python中多线程及程序锁浅析
Jan 21 Python
Python下Fabric的简单部署方法
Jul 14 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
Dec 25 Python
深入解析Python编程中super关键字的用法
Jun 24 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
用python生成1000个txt文件的方法
Oct 25 Python
Python3 chardet模块查看编码格式的例子
Aug 14 Python
python内置函数sorted()用法深入分析
Oct 08 Python
python 通过视频url获取视频的宽高方式
Dec 10 Python
Python生成随机验证码代码实例解析
Jun 09 Python
Python3+selenium配置常见报错解决方案
Aug 28 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
?繁体转换的class
2006/10/09 PHP
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
解析PHP中一些可能会被忽略的问题
2013/06/21 PHP
php导出word文档与excel电子表格的简单示例代码
2014/03/08 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP7 echo和print语句实例用法
2019/02/15 PHP
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
Javascript玩转继承(一)
2014/05/08 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
javascript 广告移动特效的实现代码
2016/06/25 Javascript
JS动态计算移动端rem的解决方案
2016/10/14 Javascript
微信小程序 label 组件详解及简单实例
2017/01/10 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
JS数组操作之增删改查的简单实现
2017/08/21 Javascript
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python操作mysql数据库
2017/03/05 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
生产部经理岗位职责
2013/12/16 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
幼儿园见习报告
2014/10/30 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
节水宣传标语口号
2015/12/26 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
SpringBoot整合Minio文件存储
2022/04/03 Java/Android