代码之家  ›  专栏  ›  技术社区  ›  mcmeeking

拆分Wagtail中StreamField内嵌套的StreamBlocks

  •  0
  • mcmeeking  · 技术社区  · 7 月前

    背景

    我试图确定在目前的情况下,这个功能是否可以在Wagtail中实现,或者我是否需要添加一个表单小部件适配器来处理这个问题。

    我的页面模型上有一个StreamField,看起来像这样:

        body = StreamField(
            [
                ("introduction", content_blocks.IntroductionBlock()),
                ("benefits", content_blocks.BenefitsBlock()),
                ("alternatives", content_blocks.AlternativesBlock()),
                ("detail", content_blocks.DetailBlock()),
                ("success", content_blocks.SuccessBlock()),
                ("complications", content_blocks.ComplicationsBlock()),
                ("medication", content_blocks.MedicationBlock()),
                ("recovery", content_blocks.RecoveryBlock()),
                ("summary", content_blocks.SummaryBlock()),
            ],
            use_json_field=True,
        )
    

    每个块的定义如下:

    class PanelBlock(blocks.StreamBlock):
        header = HeaderBlock()
        content = BaseContentBlock()
        snippet = ReusableSnippetBlock()
        choice = LibraryChoiceBlock()
        embed = VideoBlock()
        figure = FigureBlock()
    
    
    class IntroductionBlock(PanelBlock):
        class Meta:
            icon = "help"
            label = _("Introduction")
            label_format = "Introduction"
    
    
    class BenefitsBlock(PanelBlock):
        class Meta:
            icon = "circle-check"
            label = _("Benefits")
            label_format = "Benefits"
    
    # etc...
    

    我的模板逻辑使用这些“PanelBlocks”将内容分块到div中,编辑通常希望确保这些div的大小/长度大致相似,以从最终用户的角度保持内容的视觉平衡(即,一个面板不会明显长于或短于其兄弟面板)。

    问题

    在检查这些面板的“平衡”时,如果一个特定的块比它的兄弟块长得多,那么编辑器能够使用操作菜单在给定点拆分StreamBlock将非常有用(就像嵌套在StreamBlock中的RichTextBlocks一样):

    Action menu entry for RichTextBlocks

    但是StreamBlocks缺少“拆分”操作,即使父级是StreamField:

    No "Actions" submenu for StreamBlocks

    通过查看Wagtail代码库, this does appear to already be a feature from what I can tell (尽管我可能误解了),所以我的问题是:

    这是一个已经存在的功能,只是我的实现存在一些问题,导致拆分/操作菜单被错误禁用,还是这需要一个自定义解决方案?

    到目前为止,我刚刚阅读了Wagtail文档、代码库和相关的GH问题,试图找到有关现有“拆分”功能具体支持什么的详细信息,以及组合框是否可以轻松扩展。

    1 回复  |  直到 7 月前
        1
  •  0
  •   gasman    7 月前

    否,目前不支持以这种方式拆分StreamBlock。这个 splitBlock 您正在查看的方法实际上是实现RichTextBlock拆分的地方:当流的RichTextBlock子块希望拆分时,会调用该方法。由于这会导致块序列的变化,因此必须由包含块执行分割。

    目前,RichTextBlock是唯一使用此功能的块类型;然而,原则上可以将其用作在StreamBlocks内拆分StreamBlocks的基础,其中内部StreamBlock调用 splitBlock 在父母身上。不过,这还没有完成(可能是因为StreamBlock中的StreamBlock是一种非常不寻常的配置)。

    推荐文章