add/modify 阻止 shell 的 wagtail streamfield 中的值
add/modify blocks value in wagtail streamfield from shell
我有一个包含一个 StreamField body 和一个名为 HeadingBlock 的自定义块的页面:
class HeadingBlock(blocks.StructBlock):
heading = blocks.CharBlock()
cssid = blocks.CharBlock()
...
class CustomPage(Page):
...
body = StreamField([
('heading', HeadingBlock()),
...
我需要将新的字符块添加到 HeadingBlock 的标题属性,但使用 shell:
>>> from custom.models import CustomPage
>>> c = CustomPage.objects.all()[0]
>>> c.body[0].heading.value = "hello world" ??? this does not work
有人可以帮忙吗?非常感谢!
编辑:
我简化了 HeadingBlock,删除了 ListBlock 并尝试:
>>> c.body[0].value
StructValue([('heading', u'hi'), ('cssid', u'man')])
>>> type(c.body[0].value)
<class 'wagtail.wagtailcore.blocks.struct_block.StructValue'>
>>> from wagtail.wagtailcore.blocks.struct_block import StructValue
>>> c.body[0].value = StructValue([('heading', u'hello'), ('cssid', u'world')])
>>> c.save()
但是当我进入管理界面时,字段是空的。
我试过了:
>>> c.body[0].block.child_blocks
OrderedDict([('heading', <wagtail.wagtailcore.blocks.field_block.CharBlock object at 0x7f4c2aaf9790>), ('cssid', <wagtail.wagtailcore.blocks.field_block.CharBlock object at 0x7f4c2aaf9a90>)])
>>> c.body[0].block.child_blocks['heading']
<wagtail.wagtailcore.blocks.field_block.CharBlock object at 0x7f4c2aaf9790>
>>> c.body[0].block.child_blocks['heading'].value
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'CharBlock' object has no attribute 'value'
什么都没发生,我不认为这有那么难:-|
StructValue([('heading', u'hi'), ('cssid', u'man')])
输出有点误导 - 要构造您自己的 StructValue,您需要传递相应的 StructBlock 对象。您可能 运行 遇到的另一个问题是 StreamField 的值未设计为像 c.body[0].value
中那样更新 'in place'(尽管此 may change in a future Wagtail release)。
更新 StreamField 的推荐方法是构造一个新值,该值由 (block_type, value) 元组列表组成。当您使用这种方法时,StreamField 将负责将值转换为正确的类型 - 因此对于 StructBlock,您可以简单地传入一个字典而不是构建您自己的 StructValue:
c.body = [
('heading', {'heading': 'hi', 'cssid': 'man'})
]
如果字段中存在您想要保留的现有数据,更完整的代码片段可能如下所示:
new_body = []
for block_type, value in c.body:
if block_type == 'heading':
new_body.append(
('heading', {'heading': 'hello world', 'cssid': value['cssid']})
)
else:
new_body.append((block_type, value))
c.body = new_body
我有一个包含一个 StreamField body 和一个名为 HeadingBlock 的自定义块的页面:
class HeadingBlock(blocks.StructBlock):
heading = blocks.CharBlock()
cssid = blocks.CharBlock()
...
class CustomPage(Page):
...
body = StreamField([
('heading', HeadingBlock()),
...
我需要将新的字符块添加到 HeadingBlock 的标题属性,但使用 shell:
>>> from custom.models import CustomPage
>>> c = CustomPage.objects.all()[0]
>>> c.body[0].heading.value = "hello world" ??? this does not work
有人可以帮忙吗?非常感谢!
编辑: 我简化了 HeadingBlock,删除了 ListBlock 并尝试:
>>> c.body[0].value
StructValue([('heading', u'hi'), ('cssid', u'man')])
>>> type(c.body[0].value)
<class 'wagtail.wagtailcore.blocks.struct_block.StructValue'>
>>> from wagtail.wagtailcore.blocks.struct_block import StructValue
>>> c.body[0].value = StructValue([('heading', u'hello'), ('cssid', u'world')])
>>> c.save()
但是当我进入管理界面时,字段是空的。 我试过了:
>>> c.body[0].block.child_blocks
OrderedDict([('heading', <wagtail.wagtailcore.blocks.field_block.CharBlock object at 0x7f4c2aaf9790>), ('cssid', <wagtail.wagtailcore.blocks.field_block.CharBlock object at 0x7f4c2aaf9a90>)])
>>> c.body[0].block.child_blocks['heading']
<wagtail.wagtailcore.blocks.field_block.CharBlock object at 0x7f4c2aaf9790>
>>> c.body[0].block.child_blocks['heading'].value
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'CharBlock' object has no attribute 'value'
什么都没发生,我不认为这有那么难:-|
StructValue([('heading', u'hi'), ('cssid', u'man')])
输出有点误导 - 要构造您自己的 StructValue,您需要传递相应的 StructBlock 对象。您可能 运行 遇到的另一个问题是 StreamField 的值未设计为像 c.body[0].value
中那样更新 'in place'(尽管此 may change in a future Wagtail release)。
更新 StreamField 的推荐方法是构造一个新值,该值由 (block_type, value) 元组列表组成。当您使用这种方法时,StreamField 将负责将值转换为正确的类型 - 因此对于 StructBlock,您可以简单地传入一个字典而不是构建您自己的 StructValue:
c.body = [
('heading', {'heading': 'hi', 'cssid': 'man'})
]
如果字段中存在您想要保留的现有数据,更完整的代码片段可能如下所示:
new_body = []
for block_type, value in c.body:
if block_type == 'heading':
new_body.append(
('heading', {'heading': 'hello world', 'cssid': value['cssid']})
)
else:
new_body.append((block_type, value))
c.body = new_body