Получение контекста определенной c страницы в Wagtail / Puput - PullRequest
1 голос
/ 29 мая 2020

У меня есть сайт Django / Wagtail / Puput со следующей структурой:

RootPage
  |
  |- BlogPage (Puput)
  |- InformationPage

Я пытаюсь отобразить сводную информацию из блога Puput на странице InformationPage. Это работает с этим кодом , пока у меня есть только одна 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 здесь . Другими словами, если я обращаюсь к свойствам страницы блога, используя context['blog_page'] = BlogPage.objects.first(), все работает нормально, но переключение на использование context['blog_page'] = self.blog_page (и выбор правильной страницы блога в админке) не работает.

Не отключая его, я думаю, что могу иметь только один экземпляр BlogPage, потому что все InformationPages должны будут извлекаться из первого экземпляра.

Есть мысли?

1 Ответ

1 голос
/ 30 мая 2020

Вы не дали описания проблемы, кроме «это не работает», поэтому я здесь только предполагаю, но вы, вероятно, пытаетесь вывести поля страницы блога, которые являются частью модели BlogPage . Это не работает, потому что blog_page определяется как внешний ключ для wagtailcore.Page, и поэтому доступ к self.blog_page дает вам только базовый объект c Page, состоящий из основных полей, таких как title. Вы можете получить полный объект BlogPage, обратившись к 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.

...