Метод get_template
не получает значение блока в качестве параметра, поэтому нет надежного способа изменить выбранный шаблон в соответствии с этим значением. Возможно, вам удастся покопаться в контексте вызывающего шаблона, чтобы получить значение блока, как в ответе Мэтта, но это означает, что внутреннее устройство Features_Block
будет связано с использованием определенных имен переменных в вызывающем шаблоне, который является плохая вещь для многоразового кода.
(Доступ к self.use_other_template
не работает, потому что self
, объект Features_Block
, не держит значение блока как свое собственное свойство - он служит только переводчиком между различными представлениями. Итак, он знает, как отобразить данный словарь данных в виде HTML, но этот словарь данных не является чем-то, что «принадлежит» Features_Block
.)
get_template
вызывается из метода render
блока , который действительно получает значение блока, поэтому переопределение 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))