Wagtail - передача параметров в блок struct

Я пытаюсь передать параметры в структурный блок, который также имеет дочерние структурные блоки для динамической загрузки вариантов выбора через блок выбора. Пробовал концепцию с методом init, но успеха пока нет. Ниже приведен код моей реализации -

class DefaultThemeTemplate(blocks.StructBlock):
    template = blocks.ChoiceBlock(choices=[], label=_('Select a template'), required=False)

    def __init__(self, folder=None, **kwargs):
        self.template = blocks.ChoiceBlock(choices=get_designs(folder), label=_('Select a template'),
                                           required=False)
        super(DefaultThemeTemplate, self).__init__(**kwargs)

    class Meta:
        label = _('Default Theme')
        
        
class ThemeOneTemplate(blocks.StructBlock):
    template = blocks.ChoiceBlock(choices=[], label=_('Select a template'), required=False)

    def __init__(self, folder=None, **kwargs):
        self.template = blocks.ChoiceBlock(choices=get_designs(folder), label=_('Select a template'),
                                           required=False)
        super(ThemeOneTemplate, self).__init__(**kwargs)

    class Meta:
        label = _('Theme One')
        
        
class ThemeTwoTemplate(blocks.StructBlock):
    template = blocks.ChoiceBlock(choices=[], label=_('Select a template'), required=False)

    def __init__(self, folder=None, **kwargs):
        self.template = blocks.ChoiceBlock(choices=get_designs(folder), label=_('Select a template'),
                                           required=False)
        super(ThemeTwoTemplate, self).__init__(**kwargs)

    class Meta:
        label = _('Theme Two')


class Templates(blocks.StructBlock):
    default_theme = DefaultThemeTemplate(folder='', required=False)
    theme_one = ThemeOneTemplate(folder='', required=False)
    theme_two = ThemeTwoTemplate(folder='', required=False)

    def __init__(self, folder=None, **kwargs):
        self.default_theme = DefaultThemeTemplate(folder=folder, required=False)
        self.theme_one = ThemeOneTemplate(folder=folder, required=False)
        self.theme_two = ThemeTwoTemplate(folder=folder, required=False)
        super(Templates, self).__init__(**kwargs)

    class Meta:
        label = _('Template')
        
        
class StaticPage(Page):
    template = StreamField([
        ('template', Templates(required=False, folder='pages'))
    ], null=True, blank=True, verbose_name=_('Template'))

Вот скриншот с пустыми полями выбора -

enter image description here

Пожалуйста, помогите мне выяснить, что я делаю неправильно. Заранее спасибо.

Если вы изменяете дочерние блоки внутри метода __init__, вам нужно сначала вызвать super(), а затем установить запись в дикте self.child_blocks. Установка self.template не сработает, потому что код, который обрабатывает все именованные атрибуты и превращает их в список дочерних блоков, уже был запущен в этот момент, во время определения класса.

Кроме того, вам, вероятно, потребуется вызвать set_name('template') на создаваемом блоке. Итак, что-то вроде:

def __init__(self, folder=None, **kwargs):
    super().__init__(**kwargs)
    template_block = blocks.ChoiceBlock(choices=get_designs(folder), label=_('Select a template'), required=False)
    template_block.set_name('template')
    self.child_blocks['template'] = template_block
Вернуться на верх