Nar*_*asK 5 django python-3.x wagtail wagtail-streamfield wagtail-snippet
为 wagtailStreamField块构建自定义模板我发现自己需要以某种方式将当前块的 ID 传递给其他视图。
例如,当 URL 在特定块中被点击时,着陆页view必须确切知道 URL 是在哪个块中被点击的。然后view可以提取与特定块相关联但不一定在视觉上呈现给用户的其他信息。
我目前的策略是使用snippets,因此我可以传递 的 IDsnippet并且view可以获取相关但预先隐藏的数据。
这效果还不错,但人们必须在两个地方编辑内容,我不得不看着他们悲伤的脸。
似乎value块模板上下文中的变量是 的一个实例wagtail.core.blocks.struct_block.StructValue,它使我可以访问块的所有字段,但它似乎没有显示它在数据库中的足迹。
进一步value有一个有趣的属性:value.block,它似乎是用于构造块的实际模型的实例,但我再次找不到任何有用的东西,例如id或pk允许在数据库中识别该实例。
有办法吗?
您在 StreamField 的数据库表示中看到的块 ID 是由封闭的 StreamBlock 实现的详细信息,以便我们可以跟踪每个块在流中添加/移动/删除时的历史记录。流中的项目不知道自己的 ID - 这是因为它们可以是任何可能的数据类型(例如, aCharBlock生成字符串值,并且您不能将 ID 附加到字符串)。因此,块模板也无权访问 ID。
要访问 ID,您需要使用BoundBlock(或者更准确地说,StreamChild)每当您迭代 StreamField 值时返回的对象(或通过索引访问它,例如page.body[0]或page.body.0在模板代码中);该对象是块值的包装器,它知道块的类型和 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 %}
Run Code Online (Sandbox Code Playgroud)
这block是 的一个实例StreamChild,它具有 'value'、'block_type' 和 'id' 属性。通常,{% include_block %}标签只会将变量传递value到块模板,但在这里我们id作为附加变量传递,现在该变量在该块模板中可用。
StreamField 块不是“真正的”数据库对象,因此要根据 ID 再次检索值,您需要使用以下代码扫描 StreamField:
value = None
for block in page.body:
if block.id == requested_id:
value = block.value
break
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2039 次 |
| 最近记录: |