2017-07-06 12 views
2

私はWagtailウェブサイトを設定しています。Wagtail CMSを使用してPythonで親子ページタイプを検出

イベントを子ページとして持つイベントインデックスページがあります。

各イベントページは、イベントシリーズの一部である場合、子ページを持つこともできます。

メインイベントは、子イベントをページ上の一連のリンクとして表示します。子イベントは、親イベントとそれ自身の兄弟も表示する必要があります。

models.pyにはイベントクラスがあります。これまでのところ、私は子供、兄弟、両親をこのように検出しています:

@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)でさまざまなことを試しましたが、これをどのように使用するかは十分にはわかりません。 「somepage」とは何ですか?クラス、変数?私はJavascriptに慣れていて、Pythonにはかなり新しいです。

答えて

1

ここで私はそれを書くだろう方法は次のとおりです。

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

タイプ)はisinstance(parent_page, Event)です。

しかし、Wagtailの場合は、get_parentget_childrenのようなメソッドを使ってページツリーを上下に移動すると、戻ってくるページタイプを事前に知ることはできません。すべてのページに共通するtitleのようなプロパティだけを含むタイプPageの「最小」オブジェクトを返します。したがって、self.get_parent().titleは動作しますが、self.get_parent().start_dateは動作しません。これを適切なタイプの「実際の」オブジェクトに変換するには、プロパティspecificにアクセスします。これにより、不足している詳細を埋めるために舞台裏で追加のデータベース要求が行われます。

(特定の種類のページを明示的に要求するクエリを実行する場合は、Event.objects.sibling_of(self)のようなクエリでは、Eventページが返ってくるので、 。その結果にspecificを呼び出すために)

をので、if isinstance(parent_page, Event):は動作しません - その時点でparent_pageは関係なく、ページが本当にEventEventIndexであるかどうかの基本的なPage対象(であるため、それは常に、偽だろう)。

if isinstance(parent_page.specific, Event):仕事だろうが、parent_pageイベントインデックスページである場合には、あなたが本当に必要としない余分なデータベース要求をオフに発射しているので、それは、少し非効率的です。より良い選択肢は、parent_page.specific_classを使用することです。これは、ページの特定のタイプを通知して、その余分なデータベース要求を発しません。

関連する問題