django - 如何从wagtail block 模板中的struct_block.StructValue获取数据库id?

标签 django python-3.x wagtail wagtail-streamfield wagtail-snippet

为 wagtail StreamField block 构建自定义模板时,我发现自己需要以某种方式将当前 block 的 ID 传递给其他 View 。

例如,当在特定 block 中单击 URL 时,着陆页view 必须准确知道 URL 在哪个 block 中被单击。然后, View 可以提取与特定 block 关联但不一定以视觉方式呈现给用户的其他信息。

我当前的策略是使用snippets,因此我可以传递snippet的ID,并且view可以获得相关但预先隐藏的数据。

这效果还不错,但是人们必须在两个地方编辑内容,而我必须看着他们悲伤的脸。

block 模板上下文中的 value 变量似乎是 wagtail.core.blocks.struct_block.StructValue 的一个实例,它使我可以访问所有该 block 的字段,但它似乎没有显示它在数据库中的足迹。

进一步value有一个有趣的属性:value.block,它看起来像是用于构造 block 的实际模型的实例,但我又不能找到任何有用的东西,例如idpk,它们可以识别数据库中的该实例。

有办法吗?

最佳答案

您在 StreamField 的数据库表示中看到的 block ID 是由封闭的 StreamBlock 实现的详细信息,以便我们可以跟踪每个 block 在流中添加/移动/删除时的历史记录。流中的项目不知道自己的 ID - 这是因为它们可能是任何可能的数据类型(例如,CharBlock 生成一个字符串值,并且您无法将 ID 附加到字符串)。因此, block 模板也无权访问 ID。

要访问 ID,您需要使用每次迭代 StreamField 值时返回的 BoundBlock(或更准确地说,StreamChild)对象(或通过索引访问它,例如模板代码中的 page.body[0]page.body.0);该对象是 block 值的包装器,它知道 block 的类型和 ID。 (此处文档中有关 BoundBlock 的更多背景信息: http://docs.wagtail.io/en/v2.0/topics/streamfield.html#boundblocks-and-values )

{% for block in page.body %}
    {% include_block block with id=block.id %}
{% endfor %}

这里blockStreamChild的一个实例,它具有“value”、“block_type”和“id”属性。通常,{% include_block %} 标记只会将 value 变量传递给 block 模板,但这里我们将 id 传递为现在在该 block 模板中可用的附加变量。

StreamField block 不是“真正的”数据库对象,因此要根据 ID 再次检索值,您需要使用以下代码扫描 StreamField:

value = None
for block in page.body:
    if block.id == requested_id:
        value = block.value
        break

关于django - 如何从wagtail block 模板中的struct_block.StructValue获取数据库id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49390489/

相关文章:

python - Django 管理更改列表页面中未选择新行 (\n)

django Rest框架通过POST创建嵌套对象 "Models"

python - 当Django模型中设置blank=True时,如何区分需要null=True的字段?

python - Django 中基于接口(interface)和 API 的编程

python-3.x - 从具有值列表的列中检索唯一值

python - 如何从现有字典中有选择地创建字典?

python - 在 Wagtail 管理中将编辑者限制为自己的内容时出现问题

python - 使用 ipython 在 pycharm 中获得真正的代码完成

python - 如何将默认值从数据库传递到 wagtail 中的 map 字段面板

django - 使用 Wagtail CMS 片段但隐藏在管理面板中