Django Wagtail Page.objects.descendant_of (inclusive = False) Ошибка - PullRequest
0 голосов
/ 09 сентября 2018

Я использую Django 2.0 с последней версией Wagtail CMS. Я довольно новичок в Wagtail и пытаюсь запросить дочерние элементы EventIndexPage, который является EventPage, и сделать так, чтобы они появлялись на моей домашней странице.

Я пытаюсь использовать эту строку python в домашнем приложении models.py ниже:

special_events = EventIndexPage.objects.descendant_of(inclusive=False)

Но возвращается:

 return getattr(self.get_queryset(), name)(*args, **kwargs)
TypeError: descendant_of() missing 1 required positional argument: 'other'

Когда я пытаюсь поместить "EventPage" перед "inclusive = false", я получаю ошибку типа, потому что это массив, а не целое число.

документы: http://docs.wagtail.io/en/v2.0/reference/pages/queryset_reference.html

Models.py домашнего приложения:

from django.db import models
from event.models import EventIndexPage

from wagtail.core.models import Page
from wagtail.core.fields import RichTextField
from wagtail.admin.edit_handlers import FieldPanel


class HomePage(Page):
    body = RichTextField(blank=True)
    special_events = EventIndexPage.objects.descendant_of(inclusive=False)

    content_panels = Page.content_panels + [
        FieldPanel('body', classname="full"),
    ]

Models.py приложения для событий

from django.db import models

from wagtail.core.models import Page
from wagtail.core.fields import RichTextField
from wagtail.admin.edit_handlers import FieldPanel
from wagtail.search import index

class EventIndexPage(Page):
    intro = RichTextField(blank=True)

    content_panels = Page.content_panels + [
        FieldPanel('intro', classname="full")
    ]


class EventPage(Page):
    date = models.DateField("Post date")
    intro = models.CharField(max_length=250)
    body = RichTextField(blank=True)

    search_fields = Page.search_fields + [
        index.SearchField('intro'),
        index.SearchField('body'),
    ]

    content_panels = Page.content_panels + [
        FieldPanel('date'),
        FieldPanel('intro'),
        FieldPanel('body', classname="full"),
    ]

1 Ответ

0 голосов
/ 09 сентября 2018

Во-первых, эта строка кода находится не в том месте - если поместить ее сразу в 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)
...