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发送以整个文件夹的内容为附件的邮件的教程
May 06 Python
Python通过命令开启http.server服务器的方法
Nov 04 Python
python进行TCP端口扫描的实现
Dec 21 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
python+numpy实现的基本矩阵操作示例
Jul 19 Python
Django获取应用下的所有models的例子
Aug 30 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
python实现跨excel sheet复制代码实例
Mar 03 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
完美解决Django2.0中models下的ForeignKey()问题
May 19 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
python退出循环的方法
Jun 18 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 项目的方法
2007/01/02 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
PHP安全的URL字符串base64编码和解码
2014/06/19 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
自动完成的搜索框javascript实现
2016/02/26 Javascript
javascript实现简单计算器效果【推荐】
2016/04/19 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
python结合API实现即时天气信息
2016/01/19 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
Django框架视图介绍与使用详解
2019/07/18 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
Python Opencv图像处理基本操作代码详解
2020/08/31 Python
Skyscanner波兰:廉价航班
2017/11/07 全球购物
大学毕业后的十年规划
2014/01/07 职场文书
销售业务员岗位职责
2014/01/29 职场文书
应届毕业生如何写求职信
2014/02/16 职场文书
庆祝国庆节标语
2014/10/09 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
小学校本教研总结
2015/08/13 职场文书
Python异常类型以及处理方法汇总
2021/06/05 Python
Python类方法总结讲解
2021/07/26 Python
Python 中的 copy()和deepcopy()
2021/11/07 Python
对象析构函数__del__在Python中何时使用
2022/03/22 Python