0

我有一个 wagtail 项目,它利用该sites框架并有一个页面作为每个site. 这些主页(不一定)需要子页面;它们的内容是从各种 streamfield 构建StructBlock的。

这些StructBlocks 中的每一个都有一组不同的字段,但也有一些共同的字段(例如show_in_navigation)。

为了不重复show_in_navigation BooleanBlockfor each StructBlock,我使用公共字段创建了一个BaseStructBlock,并为我的特定块对其进行了子类化:

# models.py
class Homepage(Page):
    body = StreamField(
        BaseStreamBlock(),
    )

content_panels = Page.content_panels + [
    StreamFieldPanel('body'),
]

# blocks.py
class BaseStructBlock(StructBlock):
    show_in_navigation = BooleanBlock()

class BaseStructBlock(StructBlock):
    show_in_navigation = BooleanBlock()

    def get_form_context(self, value, prefix='', errors=None):
        context = super(BaseStructBlock, self).get_form_context(
            value, prefix=prefix, errors=errors
        )
        # reverse order of fields in OrderedDict, so that the fields from
        # BaseStructBlock appear after the specific fields
        context['children'] = collections.OrderedDict(
            reversed(list(context['children'].items()))
        )
        return context

    class Meta:
        abstract = True

class FooBlock(BaseStructBlock):
    # field definitions

class BarBlock(BaseStructBlock):
    # field definitions

class BaseStreamBlock(StreamBlock):
    foo_block = FooBlock()
    bar_block = BarBlock()

那行得通-我show_in_navigation在所有继承自的块中都得到了我的BaseStructBlock-但我想为这些字段自定义编辑界面:

  • 目前,所有字段都BaseStructBlock出现在子类块的字段上方 - 我想让它们显示在特定字段下方- 已解决,请参阅更新BaseStructBlock
  • 我很高兴使用所有这些很酷的面板自定义,它们可以通过edit_handlers并制作我所有的常用字段collapsible,例如。

这可能吗?非常感谢所有提示。

PS:我确实注意到 StructBlock 的文档部分自定义编辑界面,但我看不出这如何解决我的需求......

PPS:这个项目:

  • 姜戈 (2.0.1)
  • 鹡鸰 (2.0b1)
4

0 回答 0