django - 鹡鸰博客文章目录
问题描述
有没有办法为用作博客的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)),
]
)
)
我想做的是能够在每篇博客文章的顶部创建一个目录,其中包含指向文章中每个部分的链接。
解决方案
首先,我认为您ArticleSectionBlock
可以简化为:
class ArticleSectionBlock(blocks.StructBlock):
header = blocks.CharBlock(required=False))
content = blocks.RichTextBlock(required=False))
您的content
StreamField 已经定义为ArticleSectionBlock
s 的列表,因此无需ArticleSectionBlock
成为列表本身。(如果您确实希望 StreamField 成为列表列表,则此处的答案仍然适用,但您需要调整模板以使用嵌套{% for %}
循环,并记住 a 的子级ListBlock
没有唯一id
属性。)
在您的模板上,您可以循环page.content
获取具有和属性的块对象列表value
,每个对象对应一个。通过循环两次,您可以输出一个目录,然后是内容本身:block_type
id
ArticleSectionBlock
<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 }}
.
推荐阅读
- powershell - 将 if 语句的输出分配给变量 powershell
- python - Python - 遍历列表并添加 OR 选项
- django-rest-framework - 既然 Django 模板可用,为什么我们需要 Django REST 框架?
- python - 如何抓取网站并将数据放入文件中?
- linux - 提取文件中以相同模式开头的子字符串
- python - 比较打字对象的外部类型
- r - 在R中的列表列表中组合元素
- vue.js - Vue游戏:画布未清除
- node.js - Sequelize setter错误'整数的输入语法无效:“[object Object]”'
- node.js - 通配符导入在 es2020 的 node14 中不起作用