如何将计算变量添加到 wagtail StructBlock 模板上下文中?

How to add computed variable to the wagtail StructBlock template context?

我想根据 StructBlock 中的其他块值计算一些 custom 变量,并将此 custom 变量添加到模板上下文中。本质上我应该能够在 StructBlock 模板中使用这个计算变量,就像 {{ value.custom }}.

这是我的 StructBlock:

class BaseBlock(blocks.StructBlock):
    bool_fld = blocks.BooleanBlock(required=False, default=False)

    def get_context(self, *a, **kw):
        ctx = super().get_context(*a, **kw)
        ctx['custom'] = 1 if self.bool_fld else 0
        return ctx

错误:

'BaseBlock' object has no attribute 'bool_fld'

有什么想法吗?

块对象上的 get_context 方法接收块值作为其第一个参数 - 在 StructBlock 的情况下,这是一个 dict-like 对象,其字段可以作为 value['some_field'].

class BaseBlock(blocks.StructBlock):
    bool_fld = blocks.BooleanBlock(required=False, default=False)

    def get_context(self, value, parent_context=None):
        ctx = super().get_context(value, parent_context=parent_context)
        ctx['custom'] = 1 if value['bool_fld'] else 0
        return ctx

另请参阅 http://docs.wagtail.io/en/v2.0/topics/streamfield.html#template-rendering 中的 get_context 示例。

self.bool_fld 在这里不起作用,因为 Block 实例本身不保存值——它们只是充当不同数据表示之间的转换器。 (如果您使用过像 forms.CharField 这样的 Django 表单字段对象,块非常相似;块对象和表单字段对象都知道如何呈现作为表单字段传递给它们的值,但它们不坚持这些值。)