如何在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模板,我们可以通过自定义该模板来添加总数显示:
- 在项目的
templates目录下创建路径wagtailsnippets/snippets/,复制Wagtail默认的list.html到该路径(默认模板可从Wagtail源码中获取)。 - 修改自定义的
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方法,将总数传递到模板中:
- 自定义列表视图类:
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
- 在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
- 在模板中添加总数显示代码:
<p class="objects-count text-muted">共 {{ filtered_object_count }} 个对象</p>
说明
两种方法都能实现基于自定义get_queryset的总数显示:
- 方法一适合快速修改界面,直接复用现有模板结构;
- 方法二更灵活,适合需要对总数进行额外处理(比如格式化、权限判断)的场景。
内容的提问来源于stack exchange,提问作者xSkolz
相关产品推荐
相关产品推荐

