wagtailwagtail-streamfield

Add StreamBlock child items programmatically in Wagtail


I have the following StructBlock and StreamBlock below:

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

class AccordionRepeaterBlock(StreamBlock):
    accordion_item = AccordionItemBlock()

I need to programmatically add it and multiple "item" CharBlocks to this page:

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

This is how I am approaching it

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

I get errors no matter what I put in the second tuple value after 'accordion_repeater_block'. Any ideas how to solve this?


Solution

  • Found the solution! You have to make the child blocks an instance of 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()