在Wagtail / Puput中获取特定页面的上下文

问题描述 投票:1回答:1

我有一个具有以下结构的Django / Wagtail / Puput网站:

RootPage
  |
  |- BlogPage (Puput)
  |- InformationPage

我正在尝试在InformationPage上显示Puput博客的摘要信息。此代码适用于此代码,只要我只有一个BlogPage

class InformationPage(Page):
    body = RichTextField(verbose_name=_("body"))

    . . . 

    def get_context(self, request, *args, **kwargs):
        context = super(InformationPage, self).get_context(
            request, *args, **kwargs)
        context['blog_page'] = BlogPage.objects.first()
        context['information_page'] = self
        return context

但是我试图使其与多个博客页面一起使用。看来这应该工作:

class InformationPage(Page):
    body = RichTextField(verbose_name=_("body"))
    blog_page = models.ForeignKey('wagtailcore.Page', on_delete=models.PROTECT, related_name="information_blog")

    content_panels = [
        MultiFieldPanel(
            [
                FieldPanel("title", classname="title"),
                FieldPanel("body", classname="full"),
                PageChooserPanel('blog_page'),
            ],
            heading=_("Content"),
        )]

    def get_context(self, request, *args, **kwargs):
        context = super(InformationPage, self).get_context(
            request, *args, **kwargs)
        context['blog_page'] = self.blog_page
        context['information_page'] = self
        return context

但不是。这由@gasman here提出。换句话说,如果我使用context['blog_page'] = BlogPage.objects.first()引用博客页面属性,则一切正常,但是将其切换为使用context['blog_page'] = self.blog_page(并在管理中选择正确的博客页面)则无法正常工作。

[如果不进行切换,我想我只能拥有一个BlogPage实例,因为所有InformationPages都必须从第一个实例中提取。

有什么想法吗?

python django wagtail
1个回答
0
投票

除了“它不起作用”之外,您没有给出问题的描述,所以我只是在这里猜测,但是您可能正在尝试输出属于BlogPage模型的博客页面字段。这是行不通的,因为blog_page被定义为wagtailcore.Page的外键,因此访问self.blog_page仅会给您提供一个基本的Page对象,该对象包含诸如title之类的核心字段。您可以通过访问self.blog_page.specific

检索完整的BlogPage对象。
context['blog_page'] = self.blog_page.specific

但是,更明智的方法是将您的外键更改为指向BlogPage,因为在这里可能选择其他任何页面类型都是无效的:

blog_page = models.ForeignKey('my_blog_app.BlogPage', on_delete=models.PROTECT, related_name="information_blog")

进行此更改后,self.blog_page将直接返回BlogPage实例,并且不需要.specific

© www.soinside.com 2019 - 2024. All rights reserved.