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实现FTP服务器服务的方法
Apr 11 Python
Python获取当前页面内所有链接的四种方法对比分析
Aug 19 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
详解Django中CBV(Class Base Views)模型源码分析
Feb 25 Python
解决python中导入win32com.client出错的问题
Jul 26 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
Apr 08 Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 Python
python等待10秒执行下一命令的方法
Jul 19 Python
ASP.NET Core中的配置详解
Feb 05 Python
如何利用python和DOS获取wifi密码
Mar 31 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
重料打造自己的“宝马”---第三代
2021/03/02 无线电
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
2013/10/17 Javascript
jquery 实现两级导航菜单附效果图
2014/03/07 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
es6 filter() 数组过滤方法总结
2019/04/03 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
python实现socket客户端和服务端简单示例
2014/02/24 Python
python+mysql实现简单的web程序
2014/09/11 Python
python遍历类中所有成员的方法
2015/03/18 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
对python中if语句的真假判断实例详解
2019/02/18 Python
Python测试模块doctest使用解析
2019/08/10 Python
django fernet fields字段加密实践详解
2019/08/12 Python
详解python中index()、find()方法
2019/08/29 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
澳大利亚领先的在线美容商店:Facial Co
2017/10/22 全球购物
环境工程求职简历的自我评价范文
2013/10/24 职场文书
工程监理应届生求职信
2013/11/09 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
见习报告的格式
2014/11/04 职场文书
刑事和解协议书范本
2014/11/19 职场文书
2014年工程师工作总结
2014/11/25 职场文书
2014年团工作总结
2014/11/27 职场文书
佛光寺导游词
2015/02/10 职场文书
消防安全月活动总结
2015/05/08 职场文书
2015年预算员工作总结
2015/05/14 职场文书
2016年政治理论学习心得体会
2016/01/25 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python