2017-01-17 5 views
2

На домашней странице и странице поиска я хотел бы перечислить все виды страниц с различным подробным отображением. Я написал код, приведенный ниже следующий документ:Как запросить подклассы страницы в wagtail?

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

ответ

3

Вы должны использовать атрибут specific, чтобы получить наиболее конкретный подкласс формы каждого страница:

http://docs.wagtail.io/en/v1.8/reference/pages/model_reference.html#wagtail.wagtailcore.models.Page.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 
+3

Просто крошечное коррекционно - версию PageQuerySet из 'specific' будет выполнять один дополнительный запрос для каждого отдельного типа страницы, которая существует в QuerySet. Ваша точка по-прежнему стоит, но это все равно намного лучше, чем называть «конкретную» на каждой странице отдельно. – gasman

+2

@gasman исправляет, что нужно будет сделать соединение, чтобы добавить дополнительную информацию из каждой таблицы подстраниц. Я немного отредактировал ответ, чтобы это отразить. – Serafeim