Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 获取特定类型的所有StreamField块_Django_Wagtail_Wagtail Streamfield - Fatal编程技术网

Django 获取特定类型的所有StreamField块

Django 获取特定类型的所有StreamField块,django,wagtail,wagtail-streamfield,Django,Wagtail,Wagtail Streamfield,我已经创建了一个自定义的照片块,将照片嵌入到博客文章中。我正在尝试创建一个模板标记,它允许我获取存储在数据库中的每个照片块,就像您在Wagtail中查询页面一样。我宁愿不必为每张照片创建单独的页面,而是可以通过模板标签在不同的页面上显示它们 class photoBlock(blocks.StructBlock): date = blocks.DateBlock("Date Image Was Taken") location = blocks.CharBlock(max_l

我已经创建了一个自定义的照片块,将照片嵌入到博客文章中。我正在尝试创建一个模板标记,它允许我获取存储在数据库中的每个照片块,就像您在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没有属性对象。有什么想法吗?

不幸的是,查询StreamField块最有效的方法莫过于像在代码片段中那样在包含它们的所有页面上循环。这是StreamField实现的一个限制-数据作为JSON字符串存储在page对象上,而不是块作为“true”数据库对象。

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

嘿,感谢您的快速回复。你对如何更好地构建我的模型有什么建议吗?我的一个想法是为每张照片创建一个页面模型,然后通过PageChooserBlock或其他方式嵌入它。