1

我有一个带有字段 field_a、field_b 和 field_c 的片段模型(SampleSnippet)。我在 StructBlock 中使用它,例如:

class SampleBlock(blocks.StructBlock):
    service_snippet = SnippetChooserBlock(SampleSnippet)
    ...

现在我想在wagtail 管理站点上第一次保存 SampleBlock 后(保存代码段后)显示一些SampleSnippet字段(field_a 和 field_b) 。SampleBlock我怎样才能做到这一点?我环顾四周,但找不到类似的问题。

如果它是一个模型/片段,我可以将属性与 ReadOnlyPanel 一起使用,但在 StructBlock 的情况下,我被卡住了,没有得到任何想法。如果有人知道任何方法可以实现这一目标,请帮助我。提前致谢。

4

1 回答 1

1

这将是相当困难的,因为在当前 Wagtail 版本 (>=2.13) 中,StreamField 编辑 UI 是在 Javascript 客户端填充的 - 因此,有一些额外的步骤可以使客户端代码可以使用必要的数据,并且标准的 Django 表单/模板机制将不可用。

如果字段不太长,一个简单的解决方法是定义片段的__str__方法以包含所需的数据 - 这将在片段显示在管理员中的任何时候显示。

对于完整的解决方案,我建议采用这种方法:

  • form_template为您的 StructBlock设置自定义,如 StructBlock 的自定义编辑界面中所述,使用占位符<div>元素包含您的附加数据。

  • 覆盖 StructBlock get_form_state,以便返回的 dict(将用于在客户端填充表单模板)包含您的其他字段 - 例如:

    def get_form_state(self, value):
        data = super().get_form_state(value)
        data['field_a'] = value['service_snippet'].field_a
        data['field_b'] = value['service_snippet'].field_b
        return data
    
  • 按照StructBlock 表单上的附加 JavaScript 中的步骤设置自定义 JS 适配器。在最后一个render方法中,您返回的数据get_form_state将以 形式提供initialState,您可以使用它来填充<div>模板中的占位符。

于 2022-03-04T10:42:37.727 回答