2

我想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

和错误:

'BaseBlock' 对象没有属性 'bool_fld'

有任何想法吗?

4

1 回答 1

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

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

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

于 2018-04-03T16:53:40.397 回答