首页 > 解决方案 > 鹡鸰博客文章目录

问题描述

有没有办法为用作博客的wagtail网站创建目录。更具体地说,我想为每篇博文创建一个目录。

例如,我创建了一个BlogPost页面模型,其中包含StreamField博客文章中的 for 部分。流字段包含一个标题和一个富文本字段。这使我可以创建具有多个标题/部分的博客文章。

博文模型:

content = StreamField(
    [("article_section", ArticleSectionBlock())],
    null=False,
    blank=False,
)
content_panels = Page.content_panels + [
    StreamFieldPanel("content"),
]

文章部分块:

class ArticleSectionBlock(blocks.StructBlock):
    sections = blocks.ListBlock(
        blocks.StructBlock(
            [
                ("header", blocks.CharBlock(required=False)),
                ("content", blocks.RichTextBlock(required=False)),
            ]
        )
    )

我想做的是能够在每篇博客文章的顶部创建一个目录,其中包含指向文章中每个部分的链接。

标签: djangowagtail

解决方案


首先,我认为您ArticleSectionBlock可以简化为:

class ArticleSectionBlock(blocks.StructBlock):
    header = blocks.CharBlock(required=False))
    content = blocks.RichTextBlock(required=False))

您的contentStreamField 已经定义为ArticleSectionBlocks 的列表,因此无需ArticleSectionBlock成为列表本身。(如果您确实希望 StreamField 成为列表列表,则此处的答案仍然适用,但您需要调整模板以使用嵌套{% for %}循环,并记住 a 的子级ListBlock没有唯一id属性。)

在您的模板上,您可以循环page.content获取具有和属性的块对象列表value,每个对象对应一个。通过循环两次,您可以输出一个目录,然后是内容本身:block_typeidArticleSectionBlock

<ul>
    {% for block in page.content %}
        <li><a href="#{{ block.id }}">{{ block.value.header }}</a></li>
    {% endfor %}
</ul>

{% for block in page.content %}
    <h1><a id="{{ block.id }}">{{ block.value.header }}</a></h1>
    {{ block.value.content }}
{% endfor %}

block.id作为锚点 ID 的替代方法,您可以使用{{ forloop.counter }}.


推荐阅读