Wagtail:渲染来自不同页面的子元素

Wagtail: Render child elements from different page

通常在将子元素呈现到页面上时我使用 {% for item in page.get_children %} 并将它们呈现为 {{ item.specific.name }}

但是,我现在想从不在其自身模板中的页面访问子元素。 (例如将子元素从 /about.html 渲染到 /home.html)

我想它类似于 {% for item in page.pagename.get_children %} 虽然我不确定实际的页面名称...我是否必须在某处定义它/它是否在某处定义?

首先,我建议您在 get_context method 中进行页面抓取,这样您就可以自由使用 Django 的 ORM 方法,而不仅仅是那些可以写在模板中的方法。特别是,您可以使用 Page.objects.get(...) 根据标题(或任何其他条件)检索特定页面:

class HomePage(Page):
    # ...
    def get_context(self, request):
        context = super().get_context(request)
        context['about_pages'] = Page.objects.get(title='About').get_children()
        return context

这将允许您在模板上写 {% for item in about_pages %}

如果您不能将页面标题作为可预测的标题,例如 "About",那么您必须确定其他什么标准将其标识为 "the About page"。常见的方法是使用 slug (Page.objects.get(slug='about')),它不太可能被意外更改 - 或者定义一个专用的 AboutPage 页面类型并基于该类型获取:AboutPage.objects.first().

您可以在要渲染其子页面的页面的上下文中添加一个上下文变量:

class HomePage(Page):
    def get_context(self, request):
        context = super().get_context(request)
        context['about_page'] = Page.objects.get(slug='about')
        return context

然后在 home.html 你会做:

{% for item in about_page.get_children.live.in_menu %}

(如果您只想要满足这些条件的页面,请使用 .live.in_menu。)

明白了,我会把它留在这里,以防其他人偶然发现这个话题。

在 page/model.py

casestudy_root = models.ForeignKey( # Page Navigation
    'wagtailcore.Page',
    on_delete=models.PROTECT,
    related_name='+',
    null=True,
    blank=True,
)

 content_panels = Page.content_panels + [
        PageChooserPanel('casestudy_root', 'content.CaseStudyIndexPage'),
    ]

对于html

{% for casestudy in page.casestudy_root.get_children %}

修改后,运行python manage.py makemigrations后跟[=​​13=]

不要忘记select管理面板中的页面