2017-07-06 68 views
2

我正在設置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很新穎。

回答

1

以下是我會寫:

@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,它告訴你頁面的特定類型,而不會觸發額外的數據庫請求。