g-如何访问块内的StructBlock类属性

时间:2019-04-26 22:27:51

标签: django wagtail

我正在尝试覆盖此处所述的阻止模板:

https://github.com/wagtail/wagtail/issues/3857

我在类内添加了一个BooleanBlock,并尝试使用该值更改模板,但出现错误“找不到属性”。

class Features_Block(StructBlock):
    title = CharBlock()
    description = TextBlock(required=False)

    use_other_template = BooleanBlock(default=False, required=False)

    class Meta:
        icon = 'list-ul'

    def get_template(self, context=None):
        if self.use_other_template:
            return 'other_template.html'

        return 'original_template.html'

我发现了这个线程可能是答案,但是我不知道如何针对我的情况实现它:

https://github.com/wagtail/wagtail/issues/4387

2 个答案:

答案 0 :(得分:1)

get_template方法不接收块的值作为参数,因此没有可靠的方法来根据该值改变所选模板。您可能可以在调用模板的上下文中进行挖掘以检索块值,如Matt的回答那样,但这意味着Features_Block的内部结构将与调用模板中特定变量名称的使用联系在一起,对于可重用的代码来说是一件坏事。

(访问self.use_other_template无效,因为self对象Features_Block本身并不保留块值-它仅用作翻译器因此,它知道如何将给定的数据字典呈现为HTML,但是该数据字典不是“属于” Features_Block的东西。)

the block's render method中调用

get_template确实会接收到块值,因此覆盖render将使您可以基于块值来更改模板:

from django.template.loader import render_to_string
from django.utils.safestring import mark_safe

class Features_Block(StructBlock):

    # ...

    def render(self, value, context=None):
        if value['use_other_template']:
            template = 'other_template.html'
        else:
            template = 'original_template.html'

        if context is None:
            new_context = self.get_context(value)
        else:
            new_context = self.get_context(value, parent_context=dict(context))

        return mark_safe(render_to_string(template, new_context))

答案 1 :(得分:0)

检查传递给context的{​​{1}}。

get_template