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

Posted

技术标签:

【中文标题】如何将计算变量添加到 wagtail StructBlock 模板上下文?【英文标题】:How to add computed variable to the wagtail StructBlock template context? 【发布时间】:2018-09-12 23:44:25 【问题描述】:

我想根据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' 对象没有属性 'bool_fld'

有什么想法吗?

【问题讨论】:

【参考方案1】:

块对象上的get_context 方法接收块值作为其第一个参数 - 在StructBlock 的情况下,这是一个类似字典的对象,其字段可以作为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

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

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

【讨论】:

谢谢,最终我发现我可以使用ctx['value']['bool_fld'],但您的方法似乎更简洁。我认为我没有看到 get_context 在文档中的 block 对象中接收到的内容,因此将它放在那里会很好。也许我应该通过重新发布您的答案,通过 git PR 为wagtail 做出贡献:)

以上是关于如何将计算变量添加到 wagtail StructBlock 模板上下文?的主要内容,如果未能解决你的问题,请参考以下文章

Wagtail:向 PageModel 添加方法以获取检查 url

如何在 Wagtail CMS 中添加对 ImageChooserBlock 的矢量图像支持?

升级 Wagtail 后如何解决 fts5 错误

如何正确重命名 wagtail 页面模型

Wagtail Cms是否支持Google登录和用户登录添加会话

Wagtail ModelAdmin 内联?