Множество FeaturedPost на главной странице с помощью Wagtail

Я не видел ни одного подобного вопроса на сайте. Поэтому надеюсь, что этот вопрос будет полезен для других в будущем.

У меня есть PostPage, EditorialPage и DocumentPage. Внутри моделей этих трех страниц я добавил булево значение 'featured', чтобы при переключении в настройках любой пост отображался на главной странице.

This was working when it's just featured_post = PostPage.objects.live().filter(featured=True)

Однако в HomePage/Models я смог заставить его работать только с PostPage. Я не очень разбираюсь в запросах/квесте, но мне кажется, что это как-то связано с этим. Я много раз читал документацию, но не понимаю, как заставить это работать

Blog/Models.py

class PostPage(Page):
    header_image = models.ForeignKey(
    "wagtailimages.Image", 
    null=True,
    blank=True, 
    on_delete=models.SET_NULL, 
    related_name="+",
)

    featured = models.BooleanField(default=False)

    highlight = models.BooleanField(default=False)

    description = models.CharField(max_length=255, blank=True,)

    body = StreamField(BodyBlock(), blank=True)

    tags = ClusterTaggableManager(through="blog.PostPageTag", blank=True)

    post_date = models.DateTimeField(
        verbose_name="Post date", default=datetime.datetime.today
    )

content_panels = Page.content_panels + [
    ImageChooserPanel("header_image"),
    FieldPanel("description", classname="full"),
    InlinePanel("blog_authors", label="author", min_num=1, max_num=4),
    MultiFieldPanel([
        InlinePanel("categories", label="category",),
        FieldPanel("tags"),
    ], heading="Meta"),
    StreamFieldPanel("body"),
]

settings_panels = Page.settings_panels + [
    FieldPanel("post_date"),
    MultiFieldPanel([
        FieldPanel("featured"),
        FieldPanel("highlight"),
    ], heading="Showcase")
]

Home/Models.py (Метод 1)

class HomePage(RoutablePageMixin, Page):
    def get_context(self, request):

    featured_post = PostPage.objects.live().public().filter(featured=True)
    featured_editorial = EditorialPage.objects.live().public().filter(featured=True)
    feature_document = DocumentPage.objects.live().public().filter(featured=True)

    featured_select = sorted(
        chain(featured_post, featured_editorial, feature_document),
        key=lambda page: page.first_published_at, reverse=True)[0]
    
    return featured_select

Home/Models.py (Метод 2)

class HomePage(RoutablePageMixin, Page):
def get_context(self, request):
    context = super().get_context(request)

    featured_post = PostPage.objects.live().filter(featured=True)
    featured_post = EditorialPage.objects.live().filter(featured=True)
    featured_post = DocumentPage.objects.live().filter(featured=True)
    context['featured_post'] = featured_post.live().public()
    
    return context

def get_posts(self):
    return PostPage.objects.descendant_of(self).live().order_by("-post_date")

Заранее благодарю всех, кто откликнется на этот пост. Я только начал использовать Python в ноябре. Так что я все еще свеж, я думаю.

< < < <
def get_context(self, request):
    context = super().get_context(request)

    featured_post_pages = PostPage.objects.live().filter(featured=True)
    featured_editoral_pages = EditorialPage.objects.live().filter(featured=True)
    featured_document_pages = DocumentPage.objects.live().filter(featured=True)

    featured_pages = sorted(
        chain(featured_post_pages, featured_editoral_pages, featured_document_pages),
        key=lambda page: page.first_published_at, reverse=True)

    context['featured_pages'] = featured_pages
    
    return context
Похоже, что вы добавили в конец вашей генерации , это позволит получить первый элемент из списка. Кроме того, в методе 1 вы не возвращаете , а просто возвращаете , который будет одним и, скорее всего, сломается.

Больше контекста

<

Кроме того, при запросе класса, расширяющего класс Wagtail Page, он представляет собой Page QuerySet, который также имеет некоторые тонкие различия и доступные функции (например, live()).

Прочитайте обе эти страницы документации, но вам нужен способ "объединить" эти различные наборы запросов в один большой список.

Вернуться на верх