使用W CMS CMS使用Python检测父页面和子页面类型
我正在设置W website网站。使用W CMS CMS使用Python检测父页面和子页面类型
将会有一个事件索引页面,其中包含事件作为子页面。
如果事件页面是事件系列的一部分,则每个事件页面也可以有子页面。
主要事件将显示儿童事件作为页面上的一系列链接。儿童事件还需要显示父事件以及它自己的兄弟姐妹。
在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)的各种东西,但不太清楚如何使用它。 ''页面'是指什么?一个类,一个变量?我习惯于JavaScript,对Python很新颖。
以下是我会写:
@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中,检查对象是否是鹡鸰表示给定类(即一个实例的标准方式,页面是否是一个特定的类型)是isinstance(parent_page, Event)
。
然而,鹡鸰还有一个额外的并发症 - 当你上下窜动使用像get_parent
和get_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):
是行不通的 - 它永远是假的,因为在这一点上parent_page
是一个基本Page
对象(无论该页面是否是一个真正的Event
或EventIndex
)。
if isinstance(parent_page.specific, Event):
将工作,但它是一个有点低效的,因为在这种parent_page
是事件的索引页,你就发射了,你真的不需要额外的数据库请求的情况。一个更好的选择是使用parent_page.specific_class
,它告诉你页面的特定类型,而不会触发额外的数据库请求。