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读取word文档的方法
May 09 Python
Python编程实现粒子群算法(PSO)详解
Nov 13 Python
Python及PyCharm下载与安装教程
Nov 18 Python
python基础教程项目四之新闻聚合
Apr 02 Python
Python subprocess模块常见用法分析
Jun 12 Python
详解Python中的正则表达式
Jul 08 Python
python单例模式的多种实现方法
Jul 26 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
python如何查看网页代码
Jun 07 Python
Python可视化学习之seaborn调色盘
Feb 24 Python
PyTorch中permute的使用方法
Apr 26 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防CC攻击实现代码
2011/12/29 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
javascript中eval函数用法分析
2015/04/25 Javascript
JavaScript中split与join函数的进阶使用技巧
2016/05/03 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
React组件生命周期详解
2017/07/03 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
跟老齐学Python之关于类的初步认识
2014/10/11 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
Python爬虫信息输入及页面的切换方法
2018/05/11 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
python实现多线程端口扫描
2019/08/31 Python
Django继承自带user表并重写的例子
2019/11/18 Python
Python3读写ini配置文件的示例
2020/11/06 Python
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
建筑施工实习自我鉴定
2013/09/19 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
2016年员工政治思想表现评语
2015/12/02 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书
python解决12306登录验证码的实现
2021/04/18 Python
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python