You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:34:11