使用Wagtail CMS使用Python检测父页面和子页面类型

jul*_*nne 3 python django-queryset wagtail

我正在建立一个Wagtail网站。

将有一个“事件索引”页面,其中“事件”作为子页面。

每个事件页面也可以有子页面,如果它是事件系列的一部分。

主事件将子事件显示为页面上的一系列链接。子事件还需要显示父事件及其同级事件。

在models.py中,我有一个Event类。到目前为止,我正在检测像这样的孩子,兄弟姐妹,父母:

@property
def childpages(self):
    event_children = Event.objects.live().descendant_of(self)
    return event_children

@property
def parentpage(self):
    event_parent = self.get_parent()
    return event_parent

@property
def siblingpages(self):
    event_siblings = Event.objects.live().sibling_of(self, inclusive=False)
    return event_siblings
Run Code Online (Sandbox Code Playgroud)

有没有办法找出父页面类型是什么?如果它是事件索引,那么我不想在事件页面上显示它。我也不希望主事件页面显示同级。

我已经尝试过not_child_of(somepage)的各种事情,但不太确定如何使用它。“ somepage”指的是什么?一个类,一个变量?我已经习惯了Javascript,对Python还是很陌生。

gas*_*man 6

这是我的写法:

@property
def parent_event(self):
    parent_page = self.get_parent()
    if parent_page.specific_class == Event:
        return parent_page.specific  # or just `return parent_page` if you don't need the extra detail from that page
    else:
        return None

@property
def sibling_events(self):
    parent_page = self.get_parent()
    if parent_page.specific_class == Event:
        return Event.objects.live().sibling_of(self, inclusive=False)
    else:
        # this is not a child event, so don't return siblings
        return Event.objects.none()
Run Code Online (Sandbox Code Playgroud)

在Python中,检查对象是否为给定类的实例的标准方法(即用Wagtail而言,页面是否为特定类型)是isinstance(parent_page, Event)

但是,使用Wagtail会带来额外的复杂性-当您使用诸如get_parentget_children这样的方法在页面树上上下移动时,无法提前知道它将返回哪种页面类型-因此,出于性能方面的考虑,它将返回一个“最小”类型的对象,Page其中仅包含title所有页面共有的属性。因此,self.get_parent().title可以,但self.get_parent().start_date不能。要将其变成适当类型的“真实”对象,您可以访问属性specific,该属性将在后台进行额外的数据库请求以填充缺少的细节。

(请注意,当您运行明确要求特定类型页面的查询时,此方法将不适用:使用像这样的查询Event.objects.sibling_of(self),我们知道我们将Event取回页面,因此我们不需要调用specific结果。 )

因此,if isinstance(parent_page, Event):这是行不通的-它始终是false,因为在那一点上parent_page是一个基本Page对象(无论页面是真的是Event还是EventIndex)。

if isinstance(parent_page.specific, Event): 可以,但是效率有点低,因为在parent_page事件索引页面的情况下,您将触发一个您实际上不需要的额外数据库请求。更好的替代方法是使用parent_page.specific_class,它告诉您页面的特定类型,而无需触发额外的数据库请求。