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
以获取具有 value
、block_type
和 id
属性的块对象列表,每个对象对应一个 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 }}
.
有没有办法为用作博客的 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
以获取具有 value
、block_type
和 id
属性的块对象列表,每个对象对应一个 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 }}
.