【问题标题】:Multiple FeaturedPost on HomePage Using Wagtail使用 Wagtail 在主页上发布多个精选帖子
【发布时间】:2022-01-18 05:31:51
【问题描述】:

我没有在网站上看到任何这样的问题。所以希望这个问题将来对其他人有用。

我有一个 PostPage、EditorialPage 和 DocumentPage。在这三个模型中,我添加了一个“特色”布尔值,这样如果在设置中切换,任一帖子都会在主页上出现。

但是,在 HomePage/Models 中,我只能让它与 PostPage 一起使用。我对查询/查询集不太热衷,但我觉得这与此有关。我已经多次阅读文档,但我不明白如何进行这项工作。

博客/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(方法一)

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(方法二)

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")

提前感谢任何与此帖子联系的人。我在 11 月才开始使用 Python。所以我还是很新鲜,我想。

【问题讨论】:

    标签: python django django-models wagtail


    【解决方案1】:

    我可以看到您在“方法 1”中的代码是基于此答案 How can I combine two or more querysets in a Django view?

    您似乎已将[0] 添加到featured_select 生成的末尾,这将获得列表中的第一项。除此之外,在方法 1 中,您不会返回 context,而只是返回 featured_select,这将是单个 Page,并且可能会破坏。

    在方法 2 中,您正确地将某些内容添加到 context 并返回它,但在这种情况下,featured_post 只是帖子页面的 QuerySet。

    你可能需要两者的混合,像这样

    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
    

    更多上下文

    当你在 Django 中对对象执行查询时,返回的数据结构是一个 QuerySet,它有点像一个列表,但有一些特殊的特性和行为,在使用 Django 时很容易理解。 https://docs.djangoproject.com/en/4.0/ref/models/querysets/

    除此之外,当您查询扩展 Wagtail 的 Page 的类时,它是一个 Page QuerySet,它也有一些细微的区别和可用的功能(例如 live())。

    阅读这两个文档页面,但您想要的是一种将这些不同的查询集“合并”到一个大列表中的方法。

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      相关资源
      最近更新 更多