使用Wagtail CMS

时间:2017-07-06 14:38:27

标签: 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

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

我用not_child_of(somepage)尝试过各种各样的东西,但不太确定如何使用它。什么是#page; somepage'参考?一个类,一个变量?我习惯使用Javascript而不是Python的新手。

1 个答案:

答案 0 :(得分:4)

以下是我的写作方式:

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

在Python中,检查对象是否是给定类的实例的标准方法(即Wagtail术语,页面是否属于特定类型)是isinstance(parent_page, Event)

但是,使用Wagtail会带来额外的复杂性 - 当您使用get_parentget_children等方法在页面树中上下移动时,它无法进行事先知道它会返回哪种页面类型 - 因此,出于性能原因,它会返回" minimal" Page类型的对象,其中仅包含所有页面共有的title等属性。因此,self.get_parent().title可行,但self.get_parent().start_date不会。把它变成真实的"对于正确类型的对象,您将访问属性specific,该属性将在后台执行额外的数据库请求以填充缺少的详细信息。

(请注意,当您运行明确要求特定类型网页的查询时,这不适用:使用Event.objects.sibling_of(self)之类的查询,我们知道我们将会{{1}页面返回,所以我们不需要在结果上调用Event。)

因此,specific无法正常工作 - 它始终是错误的,因为此时if isinstance(parent_page, Event):是基本的parent_page对象(无论页面是否有效)实际上是PageEvent)。

EventIndex 工作,但效率有点低,因为在if isinstance(parent_page.specific, Event):是事件索引页面的情况下,你会被解雇关闭您并不真正需要的额外数据库请求。更好的选择是使用parent_page,它会告诉您页面的特定类型,而不会触发额外的数据库请求。