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

Nar*_*asK 2 django-templates python-3.x wagtail wagtail-streamfield

我想custom根据 中的其他块值计算一些变量StructBlock并将此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
Run Code Online (Sandbox Code Playgroud)

和错误:

“BaseBlock”对象没有属性“bool_fld”

有任何想法吗?

gas*_*man 6

get_context块对象上的方法接收块值作为其第一个参数 - 在 的情况下StructBlock,这是一个类似 dict 的对象,其字段可以作为 访问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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 谢谢,最终我发现我可以使用 `ctx['value']['bool_fld']`,但你的方法看起来更简洁。我不认为我已经在文档的 `block` 对象中看到 `get_context` 正在接收什么,所以它会很好。也许我应该通过重新发布您的答案来使用 git PR 为 `wagtail` 做出贡献:) (2认同)