从 shell 添加/修改 wagtail 流场中的块值

2024-04-27

我有一个页面,其中包含一个 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'

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


The StructValue([('heading', u'hi'), ('cssid', u'man')])输出有点误导 - 要构造自己的 StructValue,您需要传递相应的 StructBlock 对象。您可能遇到的另一个问题是 StreamField 的值并非设计为“就地”更新,如下所示c.body[0].value(虽然这可能会在未来的 Wagtail 版本中发生变化 https://github.com/torchbox/wagtail/issues/2876).

更新 StreamField 的推荐方法是构造一个新值,该值由 (block_type, value) 元组列表组成。当您使用这种方法时,StreamField 将负责将值转换为正确的类型 - 因此对于 StructBlock,您可以简单地传入一个 dict 而不是构建您自己的 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 shell 添加/修改 wagtail 流场中的块值 的相关文章

  • 在 wagtail 中使外部链接在新窗口中打开

    我最近实现了添加target blank 到这样的外部链接 hooks register after edit page def do after page edit request page if hasattr page body so
  • 从 wagtail 外部上传 Wagtail 图像

    在无法子类化的 Django 模型中Page 我想转换现有的 ImageField 以使用 Wagtail 图像 我将该字段重新定义为 avatar models ForeignKey wagtailimages Image null Tr
  • 图像模型数据迁移

    您好 这主要是 Google 群组中提出的问题的复制粘贴 感谢 Wagtail 文档 我能够了解如何构建自定义图像模型 但是 由于我有一个包含 500 多个内容的网站 我不想因为糟糕的数据迁移而搞乱整个事情 事实上 我不确定这里应该使用哪种
  • 限制 Wagtail Steamfield 中特定 DocumentChooserBlock() 块的文件类型

    我试图限制 wagtail 流字段块内特定 DocumentChooserBlock 的查询结果 我已经知道您可以使用以下方法限制页面类型的文档选择器的文件类型hooks 但我想避免限制页面范围内可能的文件类型 以防我需要它们用于其他 St
  • Wagtail 单元测试:添加子页面将它们转换为基本类型

    尝试为 Wagtail 创建一些单元测试并遇到以下问题 gt gt root FrontPage add root instance FrontPageFactory build gt gt root
  • 使用带有动态选择的 Wagtail“ChoiceBlock”,而不是硬编码列表

    我们有一个博客模型的设置 该模型与 BlogPageCategory 具有多对多关系 并且我们有一个 最近的博客文章 流字段块 可让您指定是否显示 X 最新博客文章的卡片 或来自特定类别的 X 最新博客文章 因此 我们从以下代码开始 fro
  • 从 S3 wagtail 提供静态文件和媒体文件

    我们将开始使用 S3 来托管我们的静态和媒体文件 有谁有一个很好的链接来描述如何用鹡鸰做到这两点 我们正在使用 Wagtail 1 9 我无法让他们两个同时工作 https wagtail io blog amazon s3 for med
  • 如何在 Wagtail 中创建不可见的虚拟页面?

    如何在 Wagtail 中创建不可见的虚拟页面 我需要 Wagtail 中的 虚拟 页面对象来为非基于 Wagtail 的页面以及外部资源构建菜单 见我的入帖here https stackoverflow com questions 56
  • 为什么 MyPage._meta.get_field("title").verbose_name 会更改 Wagtail 中所有标题的标签?

    我的 Wagtail 项目中有几个应用程序 其中之一是 新闻 其中包含新闻 页面 我想在管理中将标题的标签 标题 覆盖为 标题 News meta get field title verbose name Headline 结果 我在所有应
  • Wagtail MultiSite - 交叉发布内容

    我目前正在通过单个 Wagtail 安装构建两个站点 这些网站适用于一家公司及其姊妹公司 内容有一些重叠 理想情况下 我们不想将相同的内容发布两次 特别是 我们在两个网站上都有一个活动页面 可能有与两家公司相关的活动 问题是 Wagtail
  • wagtail页面模型与其自身的多对多关系?

    所以我得到了一个带有 同伴 字段的 PlantDetailPage 模型 是的 植物可以是同伴 其中我应该能够选择其他 PlantDetailPages 我得到了显示的东西 在内联中创建新植物 是的 菜单中的菜单中的菜单 但有几个问题 1
  • 如何更改 django wagtail 的管理徽标

    我正在做一个小项目 我想我会付出wagtail http wagtail io 尝试一下 我现在想知道如何更改侧边栏中 wagtail 的管理徽标 下图左上图 我可以改变 static wagtailadmin images wagtail
  • Wagtail 为 MyPage 设置附加权限

    这里是鹡鸰新手 我试图为特定模型添加一些额外的权限 但 wagtail admin 中没有显示任何内容 我可以用 django 方式做到这一点 但我的印象是 wagtail 可以处理这种类型的权限 我在 wagtail 文档中找不到任何提示
  • Wagtail 根据登录用户的权限过滤页面子元素

    我正在使用 Wagtail 开发一个小型网站 该网站由一个 主页 和几个 子页面 组成 到目前为止 一切都非常简单 但是 根据用户 不是管理员 所在的组 应该显示正确的子页面 请参阅以下设置 最小化 以了解我在说什么 如果我在 ToolKi
  • 在 wagtail 中批量上传和创建包含图像的页面(迁移)

    我正在使用 wagtail 创建一个网站来替换某人现有的 weebly 网站 重新创建数百个页面实例并上传每个页面的每个图像需要花费几个小时 我已经有了我需要的页面模型 并且我的网站看起来很像 wagtail 文档中的入门教程 我想知道如何
  • 在 Wagtail 中创建可重用字段集的方法?

    我正在评估 Wagtail 看看是否能在我的公司中找到它与 Wordpress 和 Drupal 一起的位置 到目前为止 我认为它很有趣并且非常喜欢其中的很多内容 但是有一件事我真的很喜欢 但找不到方法来实现 我的商店使用模式库 原子设计
  • Streamfield 中的 Wagtail SnippetChooserBlock

    我在从片段中获取值时遇到一些问题 我已使用片段选择器块将其包含到流场中 生物片段 register snippet class BioSnippet models Model name models CharField max length
  • 2.5升级后无法编辑Streamfield页面

    我在本地开发中有一个使用 Streamfield 和 2 个自定义 StructBlock 字段的站点 在 2 4 中工作正常 但升级到 2 5 后 我可以在管理中正常创建页面 但当我保存后在管理中编辑该页面时 会出现错误 我也尝试使用新的
  • 从 shell 添加/修改 wagtail 流场中的块值

    我有一个页面 其中包含一个 StreamField 正文和一个名为 HeadingBlock 的自定义块 class HeadingBlock blocks StructBlock heading blocks CharBlock cssi
  • 如何预取 Wagtail 帖子标签?

    我有大约 10 个帖子 它生成大约 100 个查询来获取帖子标签 这taggit下面使用的 Wagtail 库supportprefetch related https github com alex django taggit blob

随机推荐