如何为`StreamField`

时间:2018-02-01 21:41:05

标签: wagtail wagtail-streamfield

我有一个wagtail项目,该项目使用sites框架并且每个site都有一个页面作为主页。这些主页不一定需要子页面;他们的内容来自各种流场StructBlock

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

为了不为每个show_in_navigation重复BooleanBlock 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:我确实注意到了文档部分 Custom editing interfaces for StructBlock,但我不知道这如何能解决我的需求......

PPS:这个项目:

  • Django(2.0.1)
  • wagtail(2.0b1)

0 个答案:

没有答案