在继承类中扩展wagtail Streamfields

2024-04-27 08:43:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个抽象类,里面有hastreamfield。我还有一个从BasePage继承的CustomPage类。我希望CustomPage向内容添加新的StructBlock。我该怎么做?在

class BasePage(Page):
    content = StreamField([
        ('ad', ...),
        ('text', ...),
        ('img', ...),
    ])
    content_panels = Page.content_panels + [
        StreamFieldPanel('content'),
    ]

    class Meta:
        abstract = True

class CustomPage(BasePage):
    # add ('custom_block', ...) to content streamfield.

Tags: text内容imgpage抽象类contentadclass
2条回答

我在@gasman solutions旁边找到了另一个解决方案。在

它使用Stream field中的解构方法从BasePage StreamField中获取所有块。它在CustomPage中创建contentstreamfield时使用这些块。在

我现在就用这个,但我认为@gasman last solution是最漂亮的解决方案。在

class BasePage(Page):
    content = StreamField([
        ('ad', ...),
        ('text', ...),
        ('img', ...),
    ])
    content_panels = Page.content_panels + [
        StreamFieldPanel('content'),
    ]
    @staticmethod
    def get_content_blocks():
        return list(BasePage.content.field.deconstruct()[2][0])

    class Meta:
        abstract = True

class CustomPage(BasePage):
    content = StreamField(BasePage.get_content_blocks() +
        [
            ('custom_block', ....),
        ]
    )

StreamField定义不能以这种方式直接“扩展”,但是通过一点重新洗牌,您可以定义一个新的StreamField,该StreamField将重复使用相同的块列表:

COMMON_BLOCKS = [
    ('ad', ...),
    ('text', ...),
    ('img', ...),
]

class BasePage(Page):
    content = StreamField(COMMON_BLOCKS)
    ...

class CustomPage(BasePage):
    content = StreamField(COMMON_BLOCKS + [
        ('custom_block', ...),
    ])

或者在StreamBlock上使用继承(您可能认为这比连接列表更简洁:

^{pr2}$

另外,请注意这是only possible since Django 1.10-旧版本的Django不允许重写抽象超类的字段。在

相关问题 更多 >