1

我创建了 3 个抽象模型类:( SimpleContent仅保留标题、副标题和摘要。所有基于文本) VisualContent(图像、富文本字段) Ctalinkitem(用于添加 url,可以是页面、外部或文档)

我想创建另一个类,这些类可以包含这些类的组合以形成“类似模块”的类。

例如RichContent将拥有全部 3 个 TextLinkContent 将拥有 SimpleContent 和 Ctalinkitem

我创建了一个这样的类

class RichContent (SimpleContent, VisualContent, Ctalinkitem):
    class Meta:
        abstract = True

然后我尝试创建一个指向页面的链接

class LandingPageRichContent(Orderable, RichContent):
    page = ParentalKey('LandingPage', related_name='landingpage_richcontent_link')

然后我将其添加到页面中InlinePanel

LandingPage.content_panels = [
    FieldPanel('title',classname='full title'),
    InlinePanel(LandingPage,'landingpage_richcontent_link', label='Rich Content'),classname='full',heading='Rich Content'),
]

我进行了迁移,没有错误。但是,当我尝试创建一个 时LandingPage,我只能看到来自SimpleContent. 我看不到VisualContent和的任何输入字段Ctalinkitem

如果我将声明更改RichContent为:

class RichContent (VisualContent, SimpleContent, Ctalinkitem):

然后我只能看到来自VisualContent.

我想知道我是否采取了正确的方法?有什么解决方案可以解决这个问题吗?

4

1 回答 1

1

您需要在 上提供明确的panels定义RichContent,可能类似于:

RichContent.panels = SimpleContent.panels + VisualContent.panels + Ctalinkitem.panels

Wagtail 在某些情况下能够自动生成面板定义,但这相当有限(例如,它不识别页面选择器面板) - 特别是,如果您已经panels对每个超类都有定义,那么它不会自动将这些组合成一个列表。相反,您在这里看到的是 Python 的多重继承规则,导致panels第一个超类的属性覆盖后面的属性。

于 2015-05-05T11:17:21.027 回答