Содержание сообщения в блоге Wagtail - PullRequest
1 голос
/ 26 сентября 2019

Есть ли способ создать оглавление для сайта wagtail , который используется в качестве блога.В частности, я хочу создать оглавление для каждого сообщения в блоге.

Например, я создал модель страницы BlogPost, содержащую StreamField для разделов в сообщении блога.Поле потока содержит заголовок и поле расширенного текста.Это позволяет мне создавать записи в блоге с несколькими заголовками / разделами.

Модель блога:

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

Что я хотел быМожно создать оглавление в верхней части каждого сообщения в блоге со ссылками на каждый раздел в сообщении.

1 Ответ

2 голосов
/ 26 сентября 2019

Во-первых, я думаю, что ваш ArticleSectionBlock может быть упрощен до:

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

Ваш content StreamField уже определен как список ArticleSectionBlock с, поэтому нет необходимости в ArticleSectionBlock быть самим списком.(Если вы действительно хотите, чтобы StreamField представлял собой список списков, ответ здесь по-прежнему применим, но вам необходимо настроить шаблон для использования вложенных циклов {% for %} и помнить, что потомки ListBlock don 'у него есть уникальные свойства 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 в качестве идентификатора привязки, вы можете использовать {{ forloop.counter }}.

...