Трясогузка - как получить доступ к атрибуту класса StructBlock внутри блока - PullRequest
1 голос
/ 27 апреля 2019

Я пытаюсь переопределить свой шаблон блока, как описано здесь:

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 ]

2 голосов
/ 17 мая 2019

Метод 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))
0 голосов
/ 28 апреля 2019

Отметьте context, который передается на get_template.

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 context and context['block'].value['use_other_template']:
            return 'other_template.html'

        return 'original_template.html'
...