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 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
怎样使用Python脚本日志功能
Aug 14 Python
简单谈谈Python中的反转字符串问题
Oct 24 Python
使用Python制作微信跳一跳辅助
Jan 31 Python
Python pyinotify日志监控系统处理日志的方法
Mar 08 Python
Python检测网络延迟的代码
May 15 Python
python接口自动化(十六)--参数关联接口后传(详解)
Apr 16 Python
python中append实例用法总结
Jul 30 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
python tkinter 设置窗口大小不可缩放实例
Mar 04 Python
Python xpath表达式如何实现数据处理
Jun 13 Python
基于注解实现 SpringBoot 接口防刷的方法
Mar 02 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
德生H-501的评价与改造
2021/03/02 无线电
php防注
2007/01/15 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
Yii2中datetime类的使用
2016/12/17 PHP
PHP使用递归算法无限遍历数组示例
2017/01/13 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
Laravel多域名下字段验证的方法
2019/04/04 PHP
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
python音频处理用到的操作的示例代码
2017/10/27 Python
python opencv读mp4视频的实例
2018/12/07 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
精致的手工皮鞋:Shoe Embassy
2019/11/08 全球购物
教师节演讲稿
2014/05/06 职场文书
个人承诺书格式
2014/06/03 职场文书
爱心捐书活动总结
2014/07/05 职场文书
毕业生实习证明
2014/09/19 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
2015年资料员工作总结
2015/04/25 职场文书
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL