我有一个 wagtail 项目,它利用该sites
框架并有一个页面作为每个site
. 这些主页(不一定)需要子页面;它们的内容是从各种 streamfield 构建StructBlock
的。
这些StructBlock
s 中的每一个都有一组不同的字段,但也有一些共同的字段(例如show_in_navigation
)。
为了不重复show_in_navigation
BooleanBlock
for 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)