Django渲染Markdown文章目录的方法示例

作者:杜赛 时间:2021-03-31 05:12:07 

对会读书的人来说,读一本书要做的第一件事,就是仔细阅读这本书的目录。阅读目录可以对整体内容有所了解,并清楚地知道感兴趣的部分在哪里,提高阅读质量。

博文也是同样的,好的目录对博主和读者都很有帮助。更进一步的是,还可以在目录中设置锚点,点击标题就立即前往该处,非常的方便。

文中的目录

之前我们已经为博文支持了Markdown语法,现在继续增强其功能。

有折腾代码高亮的痛苦经历之后,设置Markdown的目录扩展就显得特别轻松了。

修改文章详情视图:


article/views.py

...

# 文章详情
def article_detail(request, id):
...
article.body = markdown.markdown(article.body,
 extensions=[
 'markdown.extensions.extra',
 'markdown.extensions.codehilite',

# 目录扩展
 'markdown.extensions.TOC',
 ]
)
...

仅仅是将将markdown.extensions.TOC扩展添加了进去。

TOC: Table of Contents,即目录的意思

代码增加这一行就足够了。为了方便测试,往之前的文章中添加几个一级标题、二级标题等。

还记得Markdown语法如何写标题吗?一级标题:# title1,二级标题:## title2

然后你可以在文中的任何地方插入[TOC]字符串,目录就自动生成好了:

Django渲染Markdown文章目录的方法示例

点击标题,页面就立即前往相应的标题处(即“锚点”的概念)。

任意位置的目录

上面的方法只能将目录插入到文章当中。如果我想把目录插入到页面的任何一个位置呢?

也简单,这次需要修改Markdown的渲染方法:


article/views.py

...

def article_detail(request, id):
...

# 修改 Markdown 语法渲染
md = markdown.Markdown(
 extensions=[
 'markdown.extensions.extra',
 'markdown.extensions.codehilite',
 'markdown.extensions.toc',
 ]
)
article.body = md.convert(article.body)

# 新增了md.toc对象
context = { 'article': article, 'toc': md.toc }

return render(request, 'article/detail.html', context)

为了能将toc单独提取出来,我们先将Markdown类赋值给一个临时变量md,然后用convert()方法将正文渲染为html页面。通过md.toc将目录传递给模板。

注意markdown.markdown()和markdown.Markdown()的区别

更详细的解释见:官方文档

为了将新的目录渲染到页面中,需要修改文章详情模板:


templates/article/detail.html

...

<div class="container">
<div class="row">
 <!-- 将原有内容嵌套进新的div中 -->
 <div class="col-9">
  <h1 class="mt-4 mb-4">{{ article.title }}</h1>
  <div class="alert alert-success">
   ...
  </div>
 </div>

<!-- 新增的目录 -->
 <div class="col-3 mt-4">
  <h4><strong>目录</strong></h4>
  <hr>
  <div>
   {{ toc|safe }}
  </div>
 </div>
</div>
</div>

...
  • 重新布局,将原有内容装进col-9的容器中,将右侧col-3的空间留给目录

  • toc需要|safe标签才能正确渲染

重新打开页面:

Django渲染Markdown文章目录的方法示例

总结

完成了文章的目录功能,至此文章详情页面也比较完善了。

项目完整代码:Django_blog_tutorial

来源:https://segmentfault.com/a/1190000017578378

标签:Django,渲染,Markdown,文章目录
0
投稿

猜你喜欢

  • 脚本安全的本质_PHP+MYSQL第1/3页

    2023-11-23 23:54:45
  • javascript设计模式交流(一)Singleton Pattern

    2007-11-29 13:20:00
  • Python爬虫框架Scrapy常用命令总结

    2022-02-21 20:45:23
  • [翻译]标记语言和样式手册 Chapter 9 精简标签

    2008-02-01 09:55:00
  • Flask  request 对象介绍

    2022-11-01 23:45:35
  • Python VTK映射三维模型表面距离

    2021-10-14 12:21:42
  • 布同自制Python函数帮助查询小工具

    2021-09-01 19:38:35
  • 详解用python实现简单的遗传算法

    2022-03-21 15:16:34
  • thinkPHP实现MemCache分布式缓存功能

    2024-03-13 00:28:05
  • pandas:get_dummies()与pd.factorize()的用法及区别说明

    2023-07-10 22:17:32
  • python时间日期操作方法实例小结

    2021-03-13 11:01:45
  • python学习之基于Python的人脸识别技术学习

    2021-04-23 22:09:25
  • python名片管理系统开发

    2022-06-25 13:43:47
  • 浅谈MySQL之select优化方案

    2024-01-27 03:32:38
  • Python 自动化表单提交实例代码

    2022-12-20 06:16:14
  • MySQL中的运算符使用实例展示

    2024-01-23 04:47:36
  • Python搭建代理IP池实现获取IP的方法

    2023-01-05 05:16:35
  • css学习笔记:安全字体

    2009-03-10 18:34:00
  • Web 标准设计实践:Google 的首页

    2008-10-12 12:14:00
  • python基于右递归解决八皇后问题的方法

    2021-01-12 21:02:38
  • asp之家 网络编程 m.aspxhome.com