Во-первых, эта строка кода находится не в том месте - если поместить ее сразу в class HomePage(Page):
, это означает, что ваш запрос будет выполнен один раз при запуске сервера, и результаты станут частью определения HomePage
. Вы, вероятно, хотите вместо этого сделать метод HomePage
, чтобы можно было повторно запускать запрос при каждой загрузке страницы:
class HomePage(Page):
body = RichTextField(blank=True)
def special_events(self):
return EventIndexPage.objects.descendant_of...
Теперь давайте посмотрим, что делает descendant_of
. EventIndexPage.objects.descendant_of(other_page)
означает "найти все EventIndexPage
страницы, которые являются потомками (то есть непосредственными детьми или внуками и т. Д.) Из other_page
". Поскольку вы на самом деле ищете EventPage
страниц, а не EventIndexPage
, вам следует использовать EventPage.objects.descendant_of
.
Теперь нам нужно предоставить other_page
- то есть сообщить ему , на какой странице они должны быть потомками. Вы можете попробовать EventPage.objects.descendant_of(EventIndexPage)
, но это не сработает, потому что EventIndexPage
- это страница типа - на вашем сайте может быть несколько EventIndexPage
с, и вам нужно дать descendant_of
конкретный экземпляр страницы. Если вы уверены, что у вас когда-либо будет только один EventIndexPage
на вашем сайте, вы можете использовать EventIndexPage.objects.first()
, чтобы сказать ему «используйте первый EventIndexPage
, с которым вы столкнетесь», что делает окончательную функцию:
class HomePage(Page):
body = RichTextField(blank=True)
def special_events(self):
event_index_page = EventIndexPage.objects.first()
return EventPage.objects.descendant_of(event_index_page)
Здесь можно смело игнорировать параметр inclusive
: он просто определяет, считается ли страница потомком самой себя, т. Е. Могут ли результаты descendant_of(other_page)
включать other_page
. В этом случае результаты EventPage.objects.descendant_of(event_index_page)
никогда не будут включать event_index_page
, поскольку event_index_page
не является EventPage
.
Последнее предложение: вам вообще нужно иметь дело с EventIndexPage
? Предположительно, вы не планируете иметь EventPage
, которые существуют за пределами EventIndexPage
, и в этом случае не имеет значения, говорит ли ваш запрос "дай мне все EventPage
s, которые являются потомками EventIndexPage
" или msgstr "дать мне все EventPage
независимо от того, где они существуют". Если это так, функция может стать просто:
class HomePage(Page):
body = RichTextField(blank=True)
def special_events(self):
return EventPage.objects.all()
Или, если вы применяете это условие, потому что вы намерены иметь несколько дочерних сайтов, каждый из которых имеет собственный EventPageIndex
и набор событий, и хотите возвращать события только для текущего дочернего сайта, вы можете воспользоваться того факта, что рассматриваемые события также являются потомками текущей домашней страницы (т.е. self
), а также являются потомками EventPageIndex
:
class HomePage(Page):
body = RichTextField(blank=True)
def special_events(self):
return EventPage.objects.descendant_of(self)