Добавление потоковых элементов 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゜