附加从外壳
/修改鹡鸰streamfield块值我有一个StreamField体页面和一个自定义模块命名HeadingBlock:附加从外壳
class HeadingBlock(blocks.StructBlock):
heading = blocks.CharBlock()
cssid = blocks.CharBlock()
...
class CustomPage(Page):
...
body = StreamField([
('heading', HeadingBlock()),
...
我需要新的charblock添加标题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
(尽管此为may change in a future Wagtail release)。
推荐的方法来更新StreamField是构造一个新的值,由(BLOCK_TYPE,值)元组的列表组成。当您使用此方法,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
谢谢,它的工作原理! –
你保存对象吗?尝试'c.save()'在末尾 – kristian
我试图简化问题 –