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管理面板中的页面
通常在将子元素呈现到页面上时我使用 {% 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管理面板中的页面