我有一个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:这个项目: