【问题标题】:ParentalKey not linked to all subclasses in Wagtail CMSParentalKey 未链接到 Wagtail CMS 中的所有子类
【发布时间】:2015-05-04 23:36:00
【问题描述】:

我创建了 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 的字段。我看不到 VisualContentCtalinkitem 的任何输入字段。

如果我将RichContent 的声明更改为:

class RichContent (VisualContent, SimpleContent, Ctalinkitem):

那么我只能看到来自VisualContent的字段。

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

【问题讨论】:

  • 谢谢@michaelpri。抱歉,我是第一次在这里发帖,下次我会多加注意的。

标签: python django wagtail


【解决方案1】:

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

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

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

【讨论】:

  • 有效!谢谢@gasman。我不知道面板被第一个超类覆盖。为了实现这样的功能,我是否使用了正确的方法?还是有其他解决方案?我想要一些预定义的前端面板,其中包含不同的类组合)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多