利用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 05 Python
Windows8下安装Python的BeautifulSoup
Jan 22 Python
学习python类方法与对象方法
Mar 15 Python
详解Django的model查询操作与查询性能优化
Oct 16 Python
浅谈python下tiff图像的读取和保存方法
Dec 04 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
解决jupyter notebook 前面书写后面内容消失的问题
Apr 13 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
Python中内建模块collections如何使用
May 27 Python
python中执行smtplib失败的处理方法
Jul 01 Python
Python如何解除一个装饰器
Aug 07 Python
python可视化大屏库big_screen示例详解
Nov 23 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中var_export与var_dump的区别分析
2010/08/21 PHP
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
JavaScript极简入门教程(一):基础篇
2014/10/25 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
jquery实现弹出层效果实例
2015/05/19 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
2016/11/09 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
更改Python命令行交互提示符的方法
2015/01/14 Python
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
Python变量和数据类型详解
2017/02/15 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
使用python实现链表操作
2018/01/26 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
Django框架模板的使用方法示例
2019/05/25 Python
Python爬虫爬取煎蛋网图片代码实例
2019/12/16 Python
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
介绍一下except的用法和作用
2015/01/22 面试题
超市营业员求职简历的自我评价
2013/10/17 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
施工安全标语
2014/06/07 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
大学生支教感言
2015/08/01 职场文书
教师外出学习心得体会
2016/01/18 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers