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

如何在Wagtail Snippet ViewSet中显示对象总数?

解决Wagtail SnippetViewSet列表视图显示对象总数的问题

问题描述

我正在开发一个Wagtail项目,之前使用ModelAdmin为模型创建自定义管理界面时,列表视图的模型名称下方会显示该模型的对象总数。切换为SnippetViewSet后,这个功能丢失了。我希望基于SnippetViewSet类中自定义的get_queryset方法,在列表视图中显示过滤后的对象总数。

当前代码:

class ModelBViewSet(SnippetViewSet):
    model = ModelB
    icon = 'folder'
    list_display = ["foo", "bar"]
    menu_name = "Unloaded Objects ModelB"

    def get_queryset(self, request):
        qs = ModelB.objects.filter(foo='foo')
        return qs

register_snippet(ModelBViewSet)

解决方案

方法一:自定义列表模板并指定给ViewSet

Wagtail的SnippetViewSet默认使用wagtailsnippets/snippets/list.html模板,我们可以通过自定义该模板来添加总数显示:

  1. 在项目的templates目录下创建路径wagtailsnippets/snippets/,复制Wagtail默认的list.html到该路径(默认模板可从Wagtail源码中获取)。
  2. 修改自定义的list.html,在模型标题下方添加总数显示。找到<h1>标签位置,插入如下代码:
<p class="objects-count text-muted">共 {{ page_obj.paginator.count }} 个对象</p>

这里的page_obj.paginator.count会自动使用get_queryset过滤后的查询集总数。
3. 在ViewSet中指定自定义模板:

class ModelBViewSet(SnippetViewSet):
    model = ModelB
    icon = 'folder'
    list_display = ["foo", "bar"]
    menu_name = "Unloaded Objects ModelB"
    list_template = "wagtailsnippets/snippets/list.html"  # 指向自定义模板

    def get_queryset(self, request):
        qs = ModelB.objects.filter(foo='foo')
        return qs

方法二:重写列表视图的上下文方法

如果不想修改模板,也可以通过重写ListView的get_context_data方法,将总数传递到模板中:

  1. 自定义列表视图类:
from wagtail.snippets.views.snippets import SnippetListView

class CustomModelBListView(SnippetListView):
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 获取过滤后的查询集总数
        context['filtered_object_count'] = self.get_queryset(self.request).count()
        return context
  1. 在ViewSet中指定该自定义视图:
class ModelBViewSet(SnippetViewSet):
    model = ModelB
    icon = 'folder'
    list_display = ["foo", "bar"]
    menu_name = "Unloaded Objects ModelB"
    list_view_class = CustomModelBListView  # 指定自定义列表视图

    def get_queryset(self, request):
        qs = ModelB.objects.filter(foo='foo')
        return qs
  1. 在模板中添加总数显示代码:
<p class="objects-count text-muted">共 {{ filtered_object_count }} 个对象</p>

说明

两种方法都能实现基于自定义get_queryset的总数显示:

  • 方法一适合快速修改界面,直接复用现有模板结构;
  • 方法二更灵活,适合需要对总数进行额外处理(比如格式化、权限判断)的场景。

内容的提问来源于stack exchange,提问作者xSkolz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:53:22