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 BeautifulSoup库抓取58手机维修信息
Nov 21 Python
python fabric使用笔记
May 09 Python
Python脚本暴力破解栅栏密码
Oct 19 Python
Python使用asyncio包处理并发详解
Sep 09 Python
Python中pillow知识点学习
Apr 30 Python
Python实现string字符串连接的方法总结【8种方式】
Jul 06 Python
Django rest framework工具包简单用法示例
Jul 20 Python
解决pycharm回车之后不能换行或不能缩进的问题
Jan 16 Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 Python
关于Python字符编码与二进制不得不说的一些事
Oct 04 Python
【超详细】八大排序算法的各项比较以及各自特点
Mar 31 Python
Django中celery的使用项目实例
Jul 07 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
php zend解密软件绿色版测试可用
2008/04/14 PHP
PHP 创建标签云函数代码
2010/05/26 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
AngularJs $parse、$eval和$observe、$watch详解
2016/09/21 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
使用Python生成url短链接的方法
2015/05/04 Python
python实现合并两个数组的方法
2015/05/16 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
Python Django中的STATIC_URL 设置和使用方式
2020/03/27 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
高档奢华时装在线目的地:FORWARD by elyse walker
2017/10/16 全球购物
学生处主任岗位职责
2013/12/01 职场文书
咖啡厅创业计划书范本
2014/01/22 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
数控专业自荐书范文
2014/03/16 职场文书
感恩节寄语2015
2015/03/24 职场文书
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server