我正在建立一个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的新手。
答案 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_parent
和get_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
对象(无论页面是否有效)实际上是Page
或Event
)。
EventIndex
会工作,但效率有点低,因为在if isinstance(parent_page.specific, Event):
是事件索引页面的情况下,你会被解雇关闭您并不真正需要的额外数据库请求。更好的选择是使用parent_page
,它会告诉您页面的特定类型,而不会触发额外的数据库请求。