0

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

4

2 回答 2

1

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

于 2017-06-08T17:41:46.690 回答
0

这里也没有真正的答案。您可以做些什么来改进您的查询是检查字符串“photoBlock”是否存在于页面正文中。流数据简单地存储为 JSON 字符串,以便仅生成包含该块的页面。

于 2017-09-01T17:44:53.130 回答