Множество FeaturedPost на главной странице с помощью Wagtail
Я не видел ни одного подобного вопроса на сайте. Поэтому надеюсь, что этот вопрос будет полезен для других в будущем.
У меня есть PostPage, EditorialPage и DocumentPage. Внутри моделей этих трех страниц я добавил булево значение 'featured', чтобы при переключении в настройках любой пост отображался на главной странице.
Однако в 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()
).
Прочитайте обе эти страницы документации, но вам нужен способ "объединить" эти различные наборы запросов в один большой список.