我有一个具有以下结构的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都必须从第一个实例中提取。
有什么想法吗?
除了“它不起作用”之外,您没有给出问题的描述,所以我只是在这里猜测,但是您可能正在尝试输出属于BlogPage模型的博客页面字段。这是行不通的,因为blog_page
被定义为wagtailcore.Page
的外键,因此访问self.blog_page
仅会给您提供一个基本的Page对象,该对象包含诸如title
之类的核心字段。您可以通过访问self.blog_page.specific
:
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
。