Django Wagtail:呈现来自不同页面的子元素

Django Wagtail:呈现来自不同页面的子元素,django,django-templates,django-views,wagtail,Django,Django Templates,Django Views,Wagtail,通常在将子元素呈现到页面上时,我使用{%for page.get_children%} 并像{{item.specific.name}} 但是,我现在想从不在自己模板中的页面访问子元素。(例如将子元素从/about.html呈现到/home.html) 我想这就像是{%for item in page.pagename.get_children%}虽然我不确定实际的页面名称…我必须在某个地方定义它吗/它是在某个地方定义的吗?首先,我建议您在一个页面中进行页面抓取,这样您就可以自由地使用Djang

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

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


我想这就像是
{%for item in page.pagename.get_children%}
虽然我不确定实际的页面名称…我必须在某个地方定义它吗/它是在某个地方定义的吗?

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

这将允许您在模板上为大约_pages%}中的项目编写
{%


如果你不能依赖于页面标题是一个可预测的标题,比如“关于”,那么你必须决定其他什么标准将其识别为“关于页面”。常用的方法是使用slug(
Page.objects.get(slug='about')
),它不太可能被意外更改,或者定义一个专用的
AboutPage
页面类型并基于此进行抓取:
AboutPage.objects.first()

首先,我建议在,因此,您可以自由地使用Django的ORM方法,而不仅仅是可以在模板中编写的方法。特别是,您可以使用
Page.objects.get(…)
根据标题(或任何其他条件)检索特定页面:

这将允许您在模板上为大约_pages%}中的项目编写
{%


如果你不能依赖于页面标题是一个可预测的标题,比如“关于”,那么你必须决定其他什么标准将其识别为“关于页面”。常用的方法是使用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

您可以向正在进行渲染的页面上下文中添加要渲染其子页面的上下文变量:

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

解决了这个问题,我将把它留在这里,以防其他人偶然发现此线程

在第页/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
,然后运行
python manage.py migrate


别忘了在管理面板中选择页面

弄明白了,我会把这个放在这里,以防其他人偶然发现这个帖子

在第页/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
,然后运行
python manage.py migrate

别忘了在管理面板中选择页面