在主页和搜索页面中,我想列出具有不同详细显示的各种页面。我在文档后面写了下面的代码:
from wagtail.wagtailcore.models import Page
from my.models import ArticlePage, GalleryPage, VideoPage, SharedLinkPage
PAGE_TYPES = (ArticlePage, GalleryPage, VideoPage, SharedLinkPage,)
class HomePage(Page):
subpage_types = list(PAGE_TYPES)
def get_context(self, request):
context = super(HomePage, self).get_context(request)
context['posts'] = Page.objects.type(PAGE_TYPES).live()
context['recent_posts'] = Page.objects.type(PAGE_TYPES).live()
return context
在这种情况下,我只能获得[<Page: 1>, <Page:2>]
,我真正想要的是[<ArticlePage: 1>, <GalleryPage:2>]
。
我的问题在搜索页面中是相同的,但search
查询:
Page.search('something', ArticlePage)
会更好:
search_backend.search('something').types(PAGE_TYPES).live()
答案 0 :(得分:4)
您应该使用specific
属性来获取每个页面的最具体的子类形式:
此外,specific()
上还有一个PageQuerySet
方法,也可以调用该方法来检索该查询集中所有页面的特定版本。
最后,请注意,在页面或查询集上调用specific
会产生额外的查询,因此请尝试将所有specific
个调用组合在一起。例如,而不是:
for page in pages: specific_page = page.specific # This will result to N extra queries (!) # do something with specific_page
做一个
for specigic_page in pages.specific(): # 1 extra query for each page subclass # do something with specific_page