对会读书的人来讲,读一本书要作的第一件事,就是仔细阅读这本书的目录。阅读目录能够对总体内容有所了解,并清楚地知道感兴趣的部分在哪里,提升阅读质量。html
博文也是一样的,好的目录对博主和读者都颇有帮助。更进一步的是,还能够在目录中设置锚点,点击标题就当即前往该处,很是的方便。python
以前咱们已经为博文支持了Markdown语法,如今继续加强其功能。git
有折腾代码高亮的痛苦经历以后,设置Markdown的目录扩展就显得特别轻松了。github
修改文章详情视图:django
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
扩展添加了进去。markdown
TOC: Table of Contents,即目录的意思布局
代码增长这一行就足够了。为了方便测试,往以前的文章中添加几个一级标题、二级标题等。测试
还记得Markdown语法如何写标题吗?一级标题:
# title1
,二级标题:## title2
网站
而后你能够在文中的任何地方插入[TOC]
字符串,目录就自动生成好了:spa
点击标题,页面就当即前往相应的标题处(即“锚点”的概念)。
上面的方法只能将目录插入到文章当中。若是我想把目录插入到页面的任何一个位置呢?
也简单,此次须要修改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
标签才能正确渲染从新打开页面:
完成了文章的目录功能,至此文章详情页面也比较完善了。
转载请注明出处。