私は抽象的な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
からフィールドです。私が更新するまで、新しく追加されたフィールドは使用できませんFoo
のedit_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原則の大規模な違反とみなしています。