如何通过Django模型获取Wagtail CMS Stream Field面板的实际值?
解决Wagtail StreamField内容分页的问题
你现在碰到的核心问题是:用values()方法获取StreamField字段时,拿到的是StreamChild对象而非实际内容——这很正常,因为values()是为Django ORM常规字段设计的,没法直接解析Wagtail StreamField的结构化内容。咱们一步步调整代码,实现你要的视频分页功能:
问题根源
all_blogs_content_pages是一个StreamField,它存储的是一组结构化内容块,MultiBlogPage.objects.values("all_blogs_content_pages")只能拿到它的原始存储对象(也就是那些StreamChild实例),而非每个内容块里的实际数据。
修正后的代码实现
你不需要查询整个MultiBlogPage的QuerySet,因为当前视图对应的就是一个MultiBlogPage实例(也就是self),直接访问它的StreamField字段就能拿到所有内容块,再做分页即可:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger def get_context(self, request, *args, **kwargs): context = super(MultiBlogPage, self).get_context(request, *args, **kwargs) context['multiblog_page'] = self # 从当前页面实例获取StreamField内容,提取每个块的实际值 all_posts = [child.value for child in self.all_blogs_content_pages] # 对实际内容列表做分页处理 paginator = Paginator(all_posts, 3) page = request.GET.get("page") try: posts = paginator.page(page) except PageNotAnInteger: posts = paginator.page(1) except EmptyPage: posts = paginator.page(paginator.num_pages) context["posts"] = posts return context
关键说明
self.all_blogs_content_pages直接返回当前页面的StreamField内容,它是可迭代的StreamValue对象,每个元素是StreamChild实例;- 通过
child.value可以拿到每个内容块的实际数据(比如你定义的视频块里的标题、视频链接等字段),处理后all_posts就变成了包含实际内容的列表,适合分页; - 如果你的StreamField里有多种类型的内容块,还可以过滤只保留视频类型:
这里的all_posts = [child.value for child in self.all_blogs_content_pages if child.block_type == 'video_block']video_block要替换成你在StreamField定义里给视频块起的名称。
内容的提问来源于stack exchange,提问作者Ebenezer Anand Arapally
相关产品推荐
相关产品推荐

