
Wagtail 如何通过自定义 PageViewSet 为页面列表添加列和筛选【免费下载链接】wagtailA Django content management system focused on flexibility and user experience项目地址: https://gitcode.com/GitHub_Trending/wa/wagtailWagtail 管理端的页面浏览器page explorer是编辑人员浏览页面树结构的主要入口。由于页面树中的页面可以有不同的类型默认只提供一组所有页面共有的字段用于显示、筛选和排序。当你希望列表里直接展示某个字段比如slug、或者按某个字段筛选页面时官方做法是创建wagtail.admin.viewsets.pages.PageViewSet的子类覆盖columns和filterset_class属性再通过register_admin_viewset钩子注册它。本文基于 docs/advanced_topics/customization/custom_page_listings.md 与相关源码给出完整的操作路径。准备工作需要在项目自己的 Django app 中完成修改涉及两个位置你定义的页面模型如BlogIndexPage、BlogPage下文的示例模型名请替换成项目中真实的模型该 app 内的wagtail_hooks.py文件所有注册代码写在这里。核心机制见 docs/reference/hooks.md 中对register_admin_viewset钩子的说明该钩子接收一个可调用对象返回ViewSet或ViewSetGroup实例也可以返回实例列表Wagtail 会把它注册到管理端。给所有页面列表添加一列假设要给页面浏览器的列表加一列显示slug字段。在 app 的wagtail_hooks.py中写# myapp/wagtail_hooks.py from wagtail import hooks from wagtail.admin.ui.tables import Column from wagtail.admin.viewsets.pages import PageViewSet from wagtail.models import Page class CustomPageViewSet(PageViewSet): columns PageViewSet.columns [ Column(slug, labelSlug, sort_keyslug), ] custom_page_viewset CustomPageViewSet() hooks.register(register_admin_viewset) def register_custom_page_viewset(): return custom_page_viewset这段代码里各部分的含义PageViewSet.columns [...]在默认列批量操作、标题、父页面、更新时间、类型、状态等之后追加新列而不是替换。默认列定义在 wagtail/admin/views/pages/listing.py 的base_columns中Column(slug, labelSlug, sort_keyslug)创建一列。根据 wagtail/admin/ui/tables/init.py 中BaseColumn的构造函数name是列在表中的内部名称label是表头显示文本不传则根据name自动生成sort_key提供后点击列头可以按该字段排序不提供则该列不可排序。Column默认通过name作为属性路径accessor从行对象上取值hooks.register(register_admin_viewset)把实例化的 viewset 注册给 Wagtail 管理端。修改后重新启动开发服务器打开 Wagtail 管理端的页面浏览器列表表头应出现Slug列且点击该列头可排序。为列表添加筛选项筛选项通过覆盖 viewset 的filterset_class属性来定制。在上面的CustomPageViewSet基础上增加一个基于默认 filterset 的子类from wagtail import hooks from wagtail.admin.viewsets.pages import PageViewSet from wagtail.models import Page class CustomPageFilterSet(PageViewSet.filterset_class): class Meta: model Page fields [slug] class CustomPageViewSet(PageViewSet): # ... filterset_class CustomPageFilterSet这里的PageViewSet.filterset_class是 Wagtail 内置的默认 filterset在 wagtail/admin/views/pages/listing.py 中为PageFilterSet包含更新时间范围、所有者、编辑者等筛选model为Page时还会加上页面类型筛选。子类里Meta.fields中的[slug]表示在此默认筛选之外为slug字段额外提供筛选控件。配置完成后管理端列表的筛选面板中会出现对应的筛选选项。只为特定页面类型的列表定制如果站点里某个父页面类型只允许创建一种子页面类型——例如BlogIndexPage的subpage_types只允许BlogPage——那么浏览BlogIndexPage子页面时可以针对BlogPage特有的字段如blog_category显示列和筛选。做法是在自定义 viewset 上设置model和parent_models属性# myapp/wagtail_hooks.py from wagtail import hooks from wagtail.admin.ui.tables import Column from wagtail.admin.viewsets.pages import PageViewSet from myapp.models import BlogIndexPage, BlogPage class BlogPageFilterSet(PageViewSet.filterset_class): class Meta: model BlogPage fields [blog_category] class BlogPageViewSet(PageViewSet): model BlogPage parent_models [BlogIndexPage] columns PageViewSet.columns [ Column(blog_category, labelCategory, sort_keyblog_category), ] filterset_class BlogPageFilterSet blog_page_viewset BlogPageViewSet() hooks.register(register_admin_viewset) def register_blog_page_viewset(): return blog_page_viewset几点需要说明示例中的BlogIndexPage、BlogPage、blog_category均为文档示例值请替换为你项目中的父页面模型、子页面模型和字段名parent_models决定了这个 viewset 在浏览哪些父页面时生效当浏览BlogIndexPage的子页面时列表就会使用这里定义的列和筛选如果不显式设置parent_modelsWagtail 会根据模型的parent_page_types/subpage_types自动推导见 wagtail/admin/viewsets/pages.py 中PageViewSet.parent_models的实现只有当某个父页面类型的subpage_types全部指向本 viewset 的模型或其子类时该父类型才会被自动关联。若推导结果为空列和筛选定制不会在页面浏览器中生效。效果同步到按页面类型的平铺列表Wagtail 默认为每种页面类型提供一个平铺列表可从页面类型使用报告page types usage report进入。文档明确说明如果你已为某个页面类型注册了自定义PageViewSet如上节那样那么所做的所有列与筛选定制也会自动应用到该页面类型的平铺列表上不需要额外代码。其他可用的列表选项除columns与filterset_class外文档还提到PageViewSet上另有用于控制列表行为的属性list_per_page每页显示条数和ordering默认排序。这两个属性在官方文档中只列出了名称和用途具体取值方式见PageViewSet的 API 参考。验证与限制验证方式启动开发服务器后登录 Wagtail 管理端检查三处——页面浏览器中对应列表的表头出现新列点击列头可排序前提是设置了sort_key筛选面板中出现新字段的筛选控件按页面类型定制时该定制只出现在受parent_models关联的父页面下其他父页面的列表保持默认。主要限制来自文档本身页面浏览器中默认只有所有页面共有的字段可用因此针对某个页面模型特有字段的列与筛选只有在列表实际只包含该类型页面由subpage_types约束保证或通过parent_models明确绑定时才有意义。进一步阅读docs/advanced_topics/customization/custom_page_listings.md本文全部示例的出处其中还包含用PageListingViewSet创建完全自定义平铺列表挂载到管理端菜单的用法docs/reference/hooks.mdregister_admin_viewset钩子的完整说明wagtail/admin/tests/pages/test_page_viewset.pyPageViewSet与parent_models自动推导行为的官方测试用例可用于理解推导规则。【免费下载链接】wagtailA Django content management system focused on flexibility and user experience项目地址: https://gitcode.com/GitHub_Trending/wa/wagtail创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考