使用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_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):是行不通的 - 它永远是假的,因为在这一点上parent_page是一个基本Page对象(无论该页面是否是一个真正的EventEventIndex )。

if isinstance(parent_page.specific, Event):工作,但它是一个有点低效的,因为在这种parent_page是事件的索引页,你就发射了,你真的不需要额外的数据库请求的情况。一个更好的选择是使用parent_page.specific_class,它告诉你页面的特定类型,而不会触发额外的数据库请求。