在演示页面中,我看到了重用常见的StreamBlock元素,以及从django.Models
继承的抽象类。
我想知道如何重用一组Wagtail Page对象。鉴于此模型:
class EventPage(Page):
body = StreamField(
HomePageStreamBlock(),
verbose_name='main content',
default=''
)
headingpanel = StreamField(
HeadingPanelStreamBlock(),
verbose_name='overpanel',
default=''
)
sidepanel = StreamField(
SidePanelStreamBlock(),
verbose_name='sidepanel',
default=''
)
master_event_id = models.CharField(max_length=1024, unique=True)
creator = JSONField(null=True, blank=True)
recurrence = ArrayField(
models.CharField(max_length=200),
null=True,
blank=True
)
google_cal_url = models.URLField('Google calendar link', max_length=1024)
calendar = models.ForeignKey(
Calendar,
on_delete=models.PROTECT,
verbose_name='Calendar',
related_name='events',
null=True,
blank=False
)
search_fields = Page.search_fields + [index.SearchField('body')]
content_panels = Page.content_panels + [
FieldPanel('calendar'),
FieldPanel('title'),
StreamFieldPanel('body'),
]
pagesection_panels = [
StreamFieldPanel('headingpanel'),
StreamFieldPanel('sidepanel'),
]
edit_handler = TabbedInterface([
ObjectList(content_panels),
ObjectList(pagesection_panels),
ObjectList(Page.promote_panels),
ObjectList(Page.settings_panels, classname='settings'),
])
我想重复使用streamfield对象(body,headingpanel,sidepanel)和content_panel StreamFieldPanel('body')
以及edit_handler
。想要这个的唯一令人信服的理由是共同的DRY原则。
我想知道在这里尝试代码重用是否可行且值得追求。我不完全理解Django ORM以及Wagtail如何实现Page
模型的确切方法。我倾向于通过避免代码重用来保持超级基本,以避免将来潜在的射击。然而,我的一部分感觉复制这么多代码很快就会变得难看。
如果我可以安全地重复使用这个通用代码,那么正确的方法是什么?我已经尝试将这些共同的对象放在一个抽象的基类中,但即使没有任何破坏并不意味着它是正确的,而且我还没有为近期的拍摄预约做好准备。
我也听说过mixins,但还没有尝试过。
我想尽快部署。功能就在那里,但我真的希望在进入生产设置之前解决这些基础问题。
非常感谢任何建议。