获取特定类型的所有StreamField块

时间:2017-06-08 17:02:04

标签: django wagtail wagtail-streamfield

我创建了一个自定义的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。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

不幸的是,查询StreamField块没有比循环覆盖包含它们的所有页面更有效的方法了,正如您在代码片段中所做的那样。这是StreamField实现的限制 - 数据作为一个JSON字符串存储在页面对象上,而不是存储为" true"数据库对象。

答案 1 :(得分:0)

这里也没有真正的答案。你可以做些什么来改善你的查询是检查页面正文中是否存在字符串'photoBlock'。流数据只是存储为JSON字符串,因此只会产生包含该块的页面。