首页 > 解决方案 > Wagtail:扩展页面模型

问题描述

我在过去为 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'),
]

用这段代码扩展我所有的 Page 类的正确 Wagtail 方法是什么?

标签: extendwagtail

解决方案


使用 Django 的Class Mixins,可以轻松地将字段添加到所有现有模型中。

1. 创建一个 Mixin

首先-创建一个扩展模型并具有元集的新CustomPageMixin(命名为任何您想要的名称) 。Pageabstract=True

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类,它们实际上会直接扩展你的 mixin。

from ... import CustomPageMixin

class StandardPage(CustomPageMixin):
    #...

class HomePage(CustomPageMixin):
    #...

3. 运行迁移

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

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

这种方法的潜在问题

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

推荐阅读