我正在尝试覆盖此处所述的阻止模板:
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'
我发现了这个线程可能是答案,但是我不知道如何针对我的情况实现它:
答案 0 :(得分:1)
get_template
方法不接收块的值作为参数,因此没有可靠的方法来根据该值改变所选模板。您可能可以在调用模板的上下文中进行挖掘以检索块值,如Matt的回答那样,但这意味着Features_Block
的内部结构将与调用模板中特定变量名称的使用联系在一起,对于可重用的代码来说是一件坏事。
(访问self.use_other_template
无效,因为self
对象Features_Block
本身并不保留块值-它仅用作翻译器因此,它知道如何将给定的数据字典呈现为HTML,但是该数据字典不是“属于” Features_Block
的东西。)
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