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


Posted in Python onJanuary 02, 2019

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

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

文中的目录

之前我们已经为博文支持了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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
零基础学Python(一)Python环境安装
Aug 20 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
May 14 Python
Python判断两个list是否是父子集关系的实例
May 04 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
python爬虫简单的添加代理进行访问的实现代码
Apr 04 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
May 28 Python
python实现获取单向链表倒数第k个结点的值示例
Oct 24 Python
Python实现大数据收集至excel的思路详解
Jan 03 Python
python3中sorted函数里cmp参数改变详解
Mar 12 Python
Java如何基于wsimport调用wcf接口
Jun 17 Python
opencv 图像轮廓的实现示例
Jul 08 Python
使用python 打开文件并做匹配处理的实例
Jan 02 #Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 #Python
python之验证码生成(gvcode与captcha)
Jan 02 #Python
Python lxml解析HTML并用xpath获取元素的方法
Jan 02 #Python
用xpath获取指定标签下的所有text的实例
Jan 02 #Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 #Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
Jan 02 #Python
You might like
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
php实现在线通讯录功能(附源码)
2016/05/13 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
2016/07/01 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
微信小程序 (地址选择1)--选取搜索地点并显示效果
2019/12/17 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
python简单的函数定义和用法实例
2015/05/07 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
Django 自动生成api接口文档教程
2019/11/19 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
详解python的super()的作用和原理
2020/10/29 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
关于赌博的检讨书
2014/01/24 职场文书
教师政风行风自查自纠报告
2014/10/21 职场文书
干部考察材料范文
2014/12/24 职场文书
教师学期个人总结
2015/02/11 职场文书
党员理论学习心得体会
2016/01/21 职场文书