I'm doing a migration from an old site, and I need to programmatically add raw html to a StreamField on a Wagtail page. How do I do it?
The StreamField is a list which contains the value and type of the sub-blocks (we will see it in a bit). You can use the built-in block shipped with Wagtail or you can create your custom block. Some block can also contains sub-block so you can use it to create a complex nested data structure, which is powerful .
Orderables let you add movable content to your page without needing a StreamField. In this video, we'll create a Bootstrap 4 Image Gallery on our Home Page model using an Orderable.
The easiest way to do this is to make sure that RawHTMLBlock is enabled on your StreamField, and then insert it there. The process for adding content to the field is as follows:
import json
original_html = '<p>Hello, world!</p>'
# First, convert the html to json, with the appropriate block type
raw_json = json.dumps([{'type': 'raw_html', 'value': original_html}])
# Load Wagtail page
my_page = Page.objects.get(id=1)
# Assuming the stream field is called 'body',
# add the json string to the field
my_page.body = raw_json
my_page.save()
You can use this approach to add other kinds of blocks to the StreamField - just make sure you create a list of dictionaries with the appropriate block type, convert it to json, and save.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With