Wagtail 博客 post table 的内容

Wagtail blog post table of contents

有没有办法为用作博客的 wagtail 网站创建 table 内容。更具体地说,我想为每个博客 post 创建一个 table 的内容 post。

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

博客post 型号:

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)),
            ]
        )
    )

我想做的是能够在每个博客 post 的顶部创建一个 table 内容,并带有指向 post 中每个部分的链接。

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

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

您的 content StreamField 已被定义为 ArticleSectionBlock 的列表,因此 ArticleSectionBlock 本身无需成为列表。 (如果您确实希望 StreamField 成为列表的列表,这里的答案仍然适用,但您需要调整模板以使用嵌套 {% for %} 循环,并记住 ListBlock 没有独特的 id 属性。)

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

<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 }}.