2017-01-16 7 views
0

私は抽象的なWagtailモデルをいくつか持っています(StreamField)。これらのうち2つ(StreamField)は、管理ビューの別のタブにあり、edit_handlerに追加されています。余分なフィールドを持つWagtail抽象モデルを拡張する正しい方法は何ですか?

class AbstractHomePage(Page): 
    body = StreamField(
     HomePageStreamBlock(), 
     default='' 
    ) 
    headingpanel = StreamField(
     HeadingPanelStreamBlock(), 
     default='' 
    ) 
    sidepanel = StreamField(
     SidePanelStreamBlock(), 
     default='' 
    ) 

    class Meta: 
     abstract = True 

    search_fields = Page.search_fields + [index.SearchField('body')] 

    content_panels = Page.content_panels + [ 
     StreamFieldPanel('body'), 
    ] 

    pagesection_panels = [ 
     StreamFieldPanel('headingpanel'), 
     StreamFieldPanel('sidepanel'), 
    ] 

    edit_handler = TabbedInterface([ 
     ObjectList(content_panels), 
     ObjectList(pagesection_panels, heading='Page sections'), 
     ObjectList(Page.promote_panels), 
     ObjectList(Page.settings_panels, classname='settings'), 
    ]) 

私は、このモデルを拡張し、フィールドを追加したい:

class Foo(AbstractHomePage): 
    extra = models.TextField() 

    Meta: 
     verbose_name='Foo' 

    content_panels = [ 
     AbstractHomePage.content_panels[0],  # title 
     FieldPanel('extra'), 
     AbstractHomePage.content_panels[-1]  # streamfield 
    ] 

新しいFooのページを追加する場合は、管理パネルで利用可能なフィールドだけがAbstractHomePageからフィールドです。私が更新するまで、新しく追加されたフィールドは使用できませんFooedit_handler

class Foo(AbstractHomePage): 
    extra = models.TextField() 

    Meta: 
     verbose_name='Foo' 

    content_panels = [ 
     AbstractHomePage.content_panels[0],  # title 
     FieldPanel('extra'), 
     AbstractHomePage.content_panels[-1]  # streamfield 
    ] 

    edit_handler = TabbedInterface([ 
     ObjectList(content_panels), 
     ObjectList(AbstractHomePage.pagesection_panels, heading='Page sections'), 
     ObjectList(Page.promote_panels), 
     ObjectList(Page.settings_panels, classname='settings'), 
    ]) 

そして今、私の質問に:私は良いコーディングプラクティスの後、間違ったか何かを行っているが?

拡張モデルごとにedit_handlerを更新する必要がある場合は、これを行うより良い方法がありますか? AbstractHomePageを拡張したモデルの新しく追加されたフィールドが明示的な "定型文"のedit_handlerブロックを確実に取得することを確実にすることは、本当に醜いと感じます。私はそれをDRY原則の大規模な違反とみなしています。

答えて

4

あなたはFooedit_handlerを再定義する必要がある理由は、Pythonは、上から下へAbstractHomePageクラス定義を評価していることである - それはライン遭遇する時点で:

ObjectList(content_panels), 

content_panelsを変数として扱われ、ないしクラスプロパティであるため、編集ハンドラはその時点で存在していたcontent_panelsリストに基づいて構築されます。サブクラス内のcontent_panelsを再定義することでこれを無効にすることはできません。

基本的に、サブクラスが定義されるまで、edit_handlerの構築を延期する方法を探しています。私はそれを直接行う良い方法は見当たりませんが、私はあなたがWagtailの内部を少し掘り下げて、それを実現できると思っています。the Page.get_edit_handler method

関連する問題