【问题标题】:How to add computed variable to the wagtail StructBlock template context?如何将计算变量添加到 wagtail StructBlock 模板上下文?
【发布时间】: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'

有什么想法吗?

【问题讨论】:

    标签: python-3.x django-templates wagtail wagtail-streamfield


    【解决方案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 做出贡献:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2020-06-06
    • 2020-04-10
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多