【问题标题】:add/modify blocks value in wagtail streamfield from shell从 shell 添加/修改 wagtail 流域中的块值
【发布时间】:2016-11-15 14:42:34
【问题描述】:

我有一个页面,其中包含一个 StreamField 正文和一个名为 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'

什么也没发生,我不认为这有那么难:-|

【问题讨论】:

  • 你在保存对象吗?最后试试c.save()
  • 我尽量简化问题

标签: wagtail wagtail-streamfield


【解决方案1】:

StructValue([('heading', u'hi'), ('cssid', u'man')]) 的输出有点误导——要构造自己的 StructValue,需要传递相应的 StructBlock 对象。您可能会遇到的另一个问题是 StreamField 的值并非设计为像 c.body[0].value 中那样“就地”更新(尽管这是 may change in a future Wagtail release)。

更新 StreamField 的推荐方法是构造一个新值,由 (block_type, value) 元组的列表组成。当您使用这种方法时,StreamField 将负责将值转换为正确的类型 - 因此对于 StructBlock,您可以简单地传入一个 dict 而不是构建自己的 StructValue:

c.body = [
    ('heading', {'heading': 'hi', 'cssid': 'man'})
]

如果字段中存在您想要保留的现有数据,更完整的代码 sn-p 可能如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2016-04-24
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多