Добавление потоковых элементов StreamBlock программно в Wagtail

У меня есть следующие StructBlock и StreamBlock ниже:

class AccordionItemBlock(StructBlock):
    title = CharBlock()
    text = RichTextBlock()

class AccordionRepeaterBlock(StreamBlock):
    accordion_item = AccordionItemBlock()

Мне нужно программно добавить его и несколько "item" CharBlocks на эту страницу:

class BasicPage(Page):
    body = StreamField([
        ('accordion_repeater_block', AccordionRepeaterBlock()),
    ], null=True)

Вот как я к этому подхожу

page.body = [
    (
        'accordion_repeater_block',
        {
            'accordion_item',
            {
                'title': 'Title goes here',
                'text': RichText('Testing!'),
            }
        }
    )
]
provider.save()

Я получаю ошибки независимо от того, что я добавляю во второе значение кортежа после 'accordion_repeater_block'. Есть идеи как решить это?

2 ответа

Решение

Нашел решение! Вы должны сделать дочерний блок экземпляром StreamValue.StreamChild:

from wagtail.wagtailcore.blocks.stream_block import StreamValue

page.body = [
    ('accordion_repeater_block',
        [
            StreamValue.StreamChild(
                id=None,
                block=AccordionItemBlock(),
                value={
                        'title': 'Title goes here',
                        'text': RichText('Testing!'),
                }
            ),
        ]
    )
]
page.save()

Для трясогузки 4.1 принятый ответ мне не помог. Вот что сделал:

      accordion_item_data = {
  'title': 'Title goes here',
  'text': RichText('Testing!'),
}

page.body = StreamValue(
  stream_block=page.body.stream_block,
  stream_data=[
    {
      "type": "accordion_repeater_block",
      "value": [{"type": "accordion_item", "value": accordion_item_data }]}
  ],
   is_lazy=True,
)
page.save()

Мне пришлось посмотреть исходный код трясогузки и сделать много проб и ошибок, так как в документации нет подсказок ヽ(*。>Д<)o゜

Другие вопросы по тегам