如何重用常见的Wagtail Page对象(streamfields,edit_handler,content_panels)

时间:2016-12-25 19:13:16

标签: django wagtail

在演示页面中,我看到了重用常见的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,但还没有尝试过。

我想尽快部署。功能就在那里,但我真的希望在进入生产设置之前解决这些基础问题。

非常感谢任何建议。

0 个答案:

没有答案