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フィールドしか表示されませんでしたSimpleContentVisualContentとの入力フィールドが表示されませんでしCtalinkitemた。

の宣言を次のように変更するRichContentと:

class RichContent (VisualContent, SimpleContent, Ctalinkitem):

からのフィールドしか見えませんVisualContent

私は正しいアプローチをしているのだろうか?これを回避する解決策はありますか?

4

1 に答える 1

1

panelsで明示的な定義を提供する必要があります。RichContentおそらく次のようなものです。

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

Wagtail は状況によってはパネル定義を自動生成できますが、これにはかなり制限があります (たとえば、ページ チューザー パネルを認識しません)。特に、panels各スーパークラスに既に定義がある場合は、これらを 1 つのリストに自動的に結合することはありません。代わりに、ここに表示されているのは、Python の複数の継承ルールによりpanels、最初のスーパークラスの属性が後のスーパークラスをオーバーライドすることです。

于 2015-05-05T11:17:21.027 に答える