Доступ к StructBlock в StreamField для Page.get_children в трясогузке
Я пытаюсь отобразить StreamField дочерней страницы на странице. Мне не удается отобразить другой StructField в StreamField. Вот мой код
class DefinitionPage(Page):
body = StreamField([
('definition', blocks.StructBlock([
('heading', blocks.CharBlock(label='Titre')),
('paragraph', blocks.RichTextBlock(label='Paragraphe')),
]))
])
content_panels = Page.content_panels + [
StreamFieldPanel('body'),
]
мой шаблон. (DefinitionPage является дочерним элементом этой страницы.)
{% for post in page.get_children %}
<h2><a href="{% pageurl post %}">{{ post.title }}</a></h2>
{% for block in post.body %}
{% include_block block %}
{% endfor %}
{% endfor %}
post.title в порядке, но в post.body вроде нет блока. Я перепробовал так много вещей, и {% include_block block %} определенно ошибался. Я также попытался добавить собственный шаблон для StructBlock, но безуспешно.
Как я могу сделать? Я использую Django 2.0 и трясогузку 2.0 (я новичок в трясогузке, но читаю документацию). С уважением,
2 ответа
Вам нужно использовать page.get_children.specific
- get_children
возвращает только основные Page
информация, общая для всех типов страниц, которая не включает body
поле в DefinitionPage
,
Спасибо, я изменил свой код. В родительской PageModel я добавил:
def get_context(self, request):
context = super().get_context(request)
definitions = self.get_children().specific()
context['definitions'] = definitions
return context
А теперь в моем шаблоне:
{% for definition in definitions %}
{% for block in definition.body %}
{% include_block block %}
{% endfor %}
{% endfor %}
Я также создал собственный шаблон для своего определения (просто это просто тестирование):
{% load wagtailcore_tags %}
<div class="definition">
<h2>{{ value.bound_blocks.heading }}</h2>
{{ value.bound_blocks.paragraph }}
</div>
большое спасибо
Просто последние вопросы: есть ли лучшая практика? . в шаблоне или в пользовательском get_context()? Полезно ли добавлять пользовательский шаблон в StructBlock?