Wagtail:扩展页面模型

Wagtail: Extend page model

我过去为 Wagtail 创建了多个页面。

示例:

class PlainPage(Page):
    body = StreamField(BasicStreamBlock, null=True, blank=True)

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

现在我想扩展所有这些页面,让它们可以设置为无索引。

出于这个原因,我想向 promote_panel 添加一个布尔字段。

将此功能添加到我已创建的所有页面的最佳方式是什么?

no_index    = models.BooleanField(default=False)

promote_panels = Page.promote_panels + [
    FieldPanel('no_index'),
]

使用此代码扩展我的所有页面 类 的正确 Wagtail 方法是什么?

使用 Django 的 Class Mixins,可以毫不费力地向所有现有模型添加字段。

1。创建一个 Mixin

首先 - 创建一个扩展 Page 模型并设置元 abstract=True 的新 CustomPageMixin(随便命名)。

class CustomPageMixin(Page):
    class Meta:
        abstract=True

    no_index = models.BooleanField(default=False)

    # adding to content_panels on other pages will need to use THIS promote_panels
    # e.g. promote_panels = CustomPageMixin.promote_panels + [...]
    promote_panels = Page.promote_panels + [
        FieldPanel('no_index'),
    ]

2。更新所有现有页面模型

更新所有正在使用的模型以使用 mixin,而不是扩展 Page class,它们实际上会直接扩展您的 mixin。

from ... import CustomPageMixin

class StandardPage(CustomPageMixin):
    #...

class HomePage(CustomPageMixin):
    #...

3。 运行 迁移

注意:这会将 no_index 字段添加到现在扩展您的新 mixin 的所有页面。

  • ./manage.py makemigrations
  • ./manage.py migrate

这种方法的潜在问题

  • 这可能不是最好的方法,因为它有点间接,乍一看很难理解。
  • 这实际上并没有改变页面模型字段,因此它只有在您通过 Page.specific
  • 访问实际特定模型的实例时才可用
  • 将它用于特殊的 Page 类型(例如 AbstractEmailForm.
  • 会有点棘手