获取特定类型的所有StreamField块

问题描述 投票:0回答:3

我创建了一个自定义 photoBlock 以将照片嵌入博客文章中。我正在尝试创建一个模板标签,它允许我获取存储在数据库中的每个 photoBlock,就像您在 Wagtail 中查询页面一样。我不想为每张照片创建单独的页面,而是如果可能的话可以通过模板标签将它们显示在不同的页面上。

class photoBlock(blocks.StructBlock):
     date = blocks.DateBlock("Date Image Was Taken")
     location = blocks.CharBlock(max_length=100)
     image = ImageChooserBlock()
     latitude = blocks.DecimalBlock(max_digits=9, decimal_places=6)
     longitude = blocks.DecimalBlock(max_digits=9, decimal_places=6)
     description = blocks.RichTextBlock()

我能够执行以下操作,但感觉查询非常繁重,一旦我有一堆帖子就会陷入困境。

for page in BlogPage.objects.all():
     for block in page.body.stream_data:
          if block['type'] == 'photoBlock':
               return block

有没有更好的方法从 Streamfield 查询特定块?每当我尝试这样的事情时

photoBlock.objects.all()

我总是收到一个错误响应,指出 photoBlock 没有属性 Object。有什么想法吗?

django wagtail wagtail-streamfield
3个回答
1
投票

不幸的是,没有比循环遍历包含 StreamField 块的所有页面更有效的方法来查询 StreamField 块,就像您在代码片段中所做的那样。这是 StreamField 实现的限制 - 数据作为 JSON 字符串存储在页面对象上,而不是作为“真正的”数据库对象的块。


0
投票

这里也没有真正的答案。为了改进查询,您可以做的是检查页面正文中是否存在字符串“photoBlock”。流数据只是存储为 JSON 字符串,这样只会生成包含该块的页面。


0
投票

对任何搜索相同内容的人进行更新:自 Wagtail 2.12 起,原始答案就不再起作用,因为

stream_data
的属性已被弃用。您可以使用以下方法来实现同样的目的:
StreamValue

© www.soinside.com 2019 - 2024. All rights reserved.