作者:HelloGitHub-文章中涉及的示例代码已经更新到HelloGitHub-团队仓库上一篇我们使用Markdown创建文章提供排版支持。Markdown在解析内容的同时,可以自动提取整个内容的目录结构。现在让我们使用Markdown为文章自动生成一个目录。在文本中插入一个目录我们先回顾一下博客的Post(文章)模型,其中body是我们存放Markdown文本的字段:blog/models.pyfromdjango.dbimportmodelsclassPost(models.Model):#Otherfields...body=models.TextField()我们再回顾一下文章详情页的视图。在detailview函数中,我们将帖子body字段中的Markdown文本解析为HTML文本,然后传递给模板进行展示。blog/views.pydefdetail(request,pk):post=get_object_or_404(Post,pk=pk)post.body=markdown.markdown(post.body,extensions=['markdown.extensions.extra','markdown.extensions.codehilite','markdown.extensions.toc',])returnrender(request,'blog/detail.html',context={'post':post})markdown.markdown()方法将Markdown文本放入post.body解析为HTML文本。同时,我们还为这个方法提供了一个额外的扩展参数。其中markdown.extensions.toc是自动生成的目录的扩展(这里可以看出我们有先见之明,如果之前没有添加,记得现在添加)。在渲染Markdown文本时添加toc扩展后,您可以在文本中插入目录。方法是在编写Markdown文本时,在要生成目录的地方插入[TOC]标签。比如你写一篇新的Markdown博文,Markdown文本内容如下:[TOC]##我是Title1,这是Title下面的文字##我是Title2,这是Title2下面的文字###我是Title2This的副标题是第二个标题下的副标题的文字##我是第三个标题这是第三个标题下的文字。最终分析的效果是:原来的[TOC]标记被内容目录所取代。在页面的任意位置插入目录上述方法的一个限制是目录只能通过[TOC]标记插入到文章内容中。如果我想在页面的其他地方(例如边栏)插入目录怎么办?方法其实很简单,只需要稍微改变一下解析Markdown文本内容的方式,具体代码如下:blog/views.pydefdetail(request,pk):post=get_object_or_404(Post,pk=pk)md=markdown.Markdown(extensions=['markdown.extensions.extra','markdown.extensions.codehilite','markdown.extensions.toc',])post.body=md.convert(post.body)发布。toc=md.tocreturnrender(request,'blog/detail.html',context={'post':post})和前面的代码不同的是,我们没有直接使用markdown.markdown()方法来渲染post.body中的内容,而是先实例化一个markdown.Markdown对象md。和markdown.markdown()方法一样,也传入了extensions参数。然后我们使用这个实例的convert方法,将post.body中的Markdown文本解析为HTML文本。一旦调用了这个方法,实例md就会有一个toc属性,这个属性的值为内容目录,我们将md.toc的值赋值给post.toc属性(注意post实例本身没有atoc属性是的,我们给它动态添加了toc属性,这就是Python动态语言的好处)。接下来在博客文章详情页的文章目录侧边栏渲染文章目录!删除占位符目录的内容并替换为以下代码:{%blocktoc%}
