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中实现两个字典(dict)合并的方法
Sep 23 Python
Python输出9*9乘法表的方法
May 25 Python
python提取页面内url列表的方法
May 25 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
Aug 07 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
python通过cookie模拟已登录状态的初步研究
Nov 09 Python
Linux 修改Python命令的方法示例
Dec 03 Python
python 在指定范围内随机生成不重复的n个数实例
Jan 28 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
Pytorch实现基于CharRNN的文本分类与生成示例
Jan 08 Python
Python与C/C++的相互调用案例
Mar 04 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
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
HTML上传控件取消选择
2013/03/06 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
jQuery鼠标事件总结
2016/10/13 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
javascript回调函数详解
2018/02/06 Javascript
Vue.directive使用注意(小结)
2018/08/31 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
vue-cli —— 如何局部修改Element样式
2020/10/22 Javascript
Python线程创建和终止实例代码
2018/01/20 Python
python读取文本中的坐标方法
2018/10/14 Python
详解Python发送email的三种方式
2018/10/18 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
keras topN显示,自编写代码案例
2020/07/03 Python
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
自我评价的正确写法
2013/09/19 职场文书
业务经理的岗位职责
2013/11/16 职场文书
英文简历中的自荐信范文
2013/12/14 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
设备售后服务承诺书
2014/05/30 职场文书
毕业生工作求职信
2014/06/30 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
检讨书范文大全
2015/05/07 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
2015年会计工作总结范文
2015/05/26 职场文书