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获取任意xml节点值的方法
May 05 Python
Python提取网页中超链接的方法
Sep 18 Python
python利用paramiko连接远程服务器执行命令的方法
Oct 16 Python
对python使用telnet实现弱密码登录的方法详解
Jan 26 Python
Python3.6实现带有简单界面的有道翻译小程序
Apr 16 Python
django2笔记之路由path语法的实现
Jul 17 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 Python
Python面向对象之多态原理与用法案例分析
Dec 30 Python
python3利用Axes3D库画3D模型图
Mar 25 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
May 15 Python
python中的错误如何查看
Jul 08 Python
Python如何使用ElementTree解析xml
Oct 12 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变量引用的面试题
2010/08/08 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
laravel自定义分页效果
2017/07/23 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
Js sort排序使用方法
2011/10/17 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
2016/06/02 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
python 根据pid杀死相应进程的方法
2017/01/16 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
实例讲解Python中浮点型的基本内容
2019/02/11 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
python3用urllib抓取贴吧邮箱和QQ实例
2020/03/10 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
医生进修自我鉴定
2014/01/19 职场文书
护士2014年终工作总结
2014/11/11 职场文书
2015年读书月活动总结
2015/03/26 职场文书
学术会议开幕词
2016/03/03 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers
nginx 配置缓存
2022/05/11 Servers