尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Wagtail 7.1 版本发布说明详解:站点级设置权限、设置预览与后台 UI 组件化

Wagtail 7.1 版本发布说明详解:站点级设置权限、设置预览与后台 UI 组件化 Wagtail 7.1 版本发布说明详解站点级设置权限、设置预览与后台 UI 组件化【免费下载链接】wagtailA Django content management system focused on flexibility and user experience项目地址: https://gitcode.com/GitHub_Trending/wa/wagtail本文以 Wagtail 7.1 的官方发布说明docs/releases/7.1.md2025 年 8 月 4 日发布为核心系统梳理本次发布的 8 项核心功能、全部升级注意事项与内部接口变更并结合当前仓库源码印证站点设置权限、设置预览、Telepath 迁移与列表按钮体系等关键实现帮助你在升级与二次开发 Wagtail 项目时准确评估影响面。读完后你将掌握如何为站点设置按站点授予编辑权限、如何为 Generic/Site 设置开启编辑时预览、StructBlock 折叠与label_format行为的变更细节以及Button/ListingButton、wagtail.admin.telepath、Tabs 组件重写等 API 迁移的具体做法。一、版本概览Wagtail 7.1 是一次以“管理后台能力增强”为主线的功能版本核心更新集中在以下几个方面Site setting 按站点授权wagtail.contrib.settings应用支持将站点设置的编辑权限授予到具体站点非超级用户可以只管理某一个站点的配置设置模型支持编辑时预览通过PreviewableMixin让 Generic/Site 设置模型在编辑时即可预览站点效果媒体列表改进图片列表支持网格/列表双布局切换文档列表新增使用次数展示可折叠的 StructBlockStructBlock支持像其他结构化块一样折叠特别适合“块设置”场景Headless 场景下的预览与 user bar 重构预览面板可加载跨域的 headless 前端wagtail-headless-preview 包user bar 重构为模板组件后可被 headless 前端独立渲染管理后台 UI 组件文档新增实验性的客户端组件复用文档与 UI 组件参考文档键盘快捷键增强支持更多快捷键侧边导航、页面编辑器小地图的开关并允许用户在个人资料中禁用全部自定义快捷键客户端面板 API页面/片段编辑表单的 panels 机制向客户端代码暴露面板结构无需再靠解析 DOM 操作表单。其余内容还包括大量零散特性、约 30 项 bug 修复、文档改进与维护性重构均在下文完整列出。二、核心新功能详解2.1 Site setting 按站点授权在此之前对某个 Site 设置模型的change权限要么全有、要么全无。7.1 起wagtail/contrib/settings 应用允许把站点设置的编辑权限按站点粒度授予给某个用户组从而让非超级用户账号也能完整掌控某一个站点的配置。从源码实现看这条链路的关键点如下wagtail/contrib/settings/models.py 中BaseSiteSetting.get_permission_policy()返回SitePermissionPolicy(cls)而非通用设置的ModelPermissionPolicy这是按站点鉴权的策略基础wagtail/contrib/settings/registry.py 的Registry.register()在注册一个 Site 设置模型时会自动构造SitePermissionForm的子类并通过register_group_permission_panelhook 挂到“组编辑”页面上见第 90–98 行的逻辑即组权限面板上会出现一个该设置专属的“可编辑站点”勾选列表wagtail/contrib/settings/forms.py 中的SitePermissionForm负责渲染与保存该面板save()方法对GroupSitePermission做差集增删sites_to_add/sites_to_remove把每个被勾选站点与该设置模型的change权限绑定wagtail/contrib/settings/views.py 中的EditView.get_object()第 126–136 行在打开编辑页时会执行permission_policy.user_has_permission_for_instance(request.user, change, site)没有对应站点的权限会直接抛出PermissionDenied同一视图中get_context_data()会在用户可编辑站点多于一个时注入SiteSwitchFormwagtail/contrib/settings/forms.py 第 14–41 行在管理后台提供站点切换器redirect_to_relevant_instance()则在用户访问“无站点”入口时自动重定向到其有权限的第一个站点。更多 API 说明可参阅 wagtail.contrib.settings 参考文档。2.2 Generic / Site 设置的编辑时预览7.1 允许通过PreviewableMixin为 generic 和 site 设置模型启用预览在设置编辑页中即可预览站点效果无需先保存。源码层面的支撑在 wagtail/contrib/settings/views.pyEditView.get_preview_url()第 186–191 行判断isinstance(self.object, PreviewableMixin) and self.object.is_previewable()满足条件时返回wagtailsettings:preview_on_edit预览地址EditView.get_side_panels()第 193–200 行在存在预览时自动附加PreviewSidePanel与ChecksSidePanelPreviewOnEdit视图第 203–228 行处理 Site 设置时通过self.model.for_site(self.site)取实例并把实例注入request属性attrs[self.object.get_cache_attr_name()] self.object使 context processor 在预览渲染时使用当前编辑中的数据从而在未保存状态下也能正确渲染预览。PreviewableMixin的定义位于 wagtail/models/preview.py。对设置模型而言只需让模型继承PreviewableMixin并配置preview_template即可获得与页面类似的“边编辑、边预览”体验。2.3 媒体列表改进Grid / List 双布局图片列表现在同时支持网格布局与列表布局用户可通过一个简单开关切换。列表布局展示更多元信息文件名、所属 collection、创建日期、使用次数便于 CMS 用户管理更庞大的图片库也为未来展示更多图片元数据打下基础。文档列表同样新增每个文档的使用次数展示。该功能由 Google Summer of Code 贡献者实现。注意如果你覆盖过wagtailimages的列表视图模板需要按新模板同步适配见第五节“图片列表的列表视图”。2.4 可折叠的 StructBlock块设置场景StructBlock创建的块现在可以像其他结构化块类型一样折叠/展开方便在复杂结构化内容中导航。典型场景是“块设置”——块支持大量可选字段时可把设置子块默认折叠class BlockQuote(StructBlock): text TextBlock() attribute_name CharBlock(blankTrue, requiredFalse, labele.g. Mary Berry) # 设置块内的字段可用但默认隐藏 settings ThemeSettingsBlock(collapsedTrue)相关用法可参考仓库文档中的 StructBlock 自定义编辑界面与 StreamField 块引用章节。2.5 Headless 场景预览与 user bar 改进实时预览与 user bar 功能在本版本重构以更好地服务 headless 部署预览面板现在可以加载跨域的 headless 前端由wagtail-headless-preview包提供Wagtail user bar重构为模板组件可独立渲染并由 headless 前端加载。将 user bar 集成进前端后页面编辑器中的以下能力可在前端页面上生效实时预览的滚动位置恢复可访问性检查内容指标字数、阅读时长。2.6 管理后台 UI 组件文档实验性开发文档新增了复用客户端代码JavaScript 组件与UI 组件两篇实验性文档。目标是在定制/扩展管理后台界面时复用现有组件降低构建与维护成本。需要特别注意这些文档与组件复用本身都是实验性的——组件 API 可能在次版本中变更且不走 deprecation 流程。若在自己的代码中使用这些组件务必有测试流程来捕获升级带来的破坏性变更。2.7 键盘快捷键增强管理后台新增更多键盘快捷键本版本覆盖开关主导航侧边栏、页面编辑器内的小地图。此外用户可以通过个人资料中的一个专门设置禁用 Wagtail 的全部自定义快捷键。2.8 客户端面板 APIClient-side panels API页面与片段编辑表单使用的 panels 机制现在向客户端代码提供访问面板结构的 API。这意味着可以不再通过遍历并不保证跨版本稳定的HTML 结构来检索和操作表单内容而是直接使用结构化接口。详见 扩展文档中的客户端面板章节。2.9 其他特性Other features发布说明完整列出的其他特性如下按主题归类块与 StreamField为所有 StreamField 块添加form_attrs支持提升 StreamField 中更多 widget 类型对label_format的支持支持在Blockmeta 选项中将preview_value与default设为可调用对象用于 StreamField 中的动态预览折叠状态的 StreamField 块始终显示块类型为RichTextBlock与RichTextField添加最小长度校验允许SnippetChooserBlock的icon优先于SnippetViewSet.icon将TypedTableBlock内容纳入搜索索引。图片与图像标签Jinja2 图片标签支持preserve-svgImage.get_rendition直接调用时识别preserve-svg过滤参数Image.get_renditions、picture与srcset_image标签支持preserve-svg从AbstractRendition.background_position_style中拆分出独立的background_position_x/background_position_y属性。列表、权限与 API新增 locale 感知的NumberColumn用于通用列表中的数字展示允许在自定义字段上搜索用户索引API 的find视图重定向到detail视图时保留查询参数批量删除视图遵循受保护外键约束。管理体验头部面包屑记住展开/收起状态跨导航与刷新列表按钮渲染为模板组件为RevisionMixin与WorkflowMixin定义默认GenericRelations避免删除级联问题复制页面成功消息中新增“Edit”按钮多图上传器的文件选择对话框限制为允许的图片文件类型通过批量操作删除大量页面时新增“键入确认”步骤用户列表中用对勾/叉号图标区分启用状态不再依赖颜色。嵌入oEmbed新增 iHeart oEmbed 提供商Twitter oEmbed 提供商识别 x.com 链接改用requests访问 oEmbed 端点以获得更健壮的 SSL 证书处理。其他新增NoFutureDateValidator用于校验“未来日期”非法标题转 slug 的音译改为 locale 感知并提供更多自定义选项自定义 slug widget切换管理后台中模型语言时locale 选择器支持翻译字符串拼接将init_new_page信号补充文档并迁移位置见 4.4项目模板文档补充测试说明并在模板中加入起步测试文件。2.10 Bug 修复Bug fixes本版本修复了约 30 个问题完整清单如下按主题归类均保留原文作者信息翻译与本地化处理RichTextBlock的 lazy 翻译字符串作为preview_valueSeb Corbinhuman_readable_date模板标签使用正确的本地化格式工具Seb Corbin面板折叠按钮的标签可翻译Thibaud Colas。表单与块表单构造器使用非 Windows 换行符时处理换行分隔的选项Baptiste MispelonFloatBlock处理help_text关键字参数Nick SmithStreamField widget 出错时在输入上设置aria-invalidSage Abdullah。权限与 URL退出管理后台时遵循WAGTAILADMIN_LOGIN_URLAntoine Rodriguez, Ramon de Jezus图片/文档批量操作中的“列表所有条目”选项遵循用户权限Alex Morega。Widget / 视图机制修复ViewSet.inject_view_methods带多个方法时的行为Gorlikexclude_fields_in_copy处理非 JSON 安全字段Matt Westcott访问非表单页面的 submissions 列表视图时报错问题Sage Abdullah。图片与上传Firefox 下通过图片选择器上传 AVIF 图片Matt Westcott。CSP 与样式HTML 文件中的内联样式替换为 CSS 类Srishti Jaiswal重构剩余内联样式以规避 unsafe-inline style-src CSPChiemezuo Akujobi。列表渲染除非显式开启不再在列表表格单元格内断词Ziyao Yan通用列表中分页大数字的适当内边距M. Sumair KhokharBooleanColumn图标更新为不依赖颜色即可区分Sage Abdullah。API 与搜索正确按混合升/降序排序 API 结果Rohit Sharma, Mahmoud Nasser数据库搜索后端支持复杂order_by表达式Seb Corbin移除 MySQL 上导致自动补全搜索无结果的 ngram 解析器Vince Salvino。迁移与项目home 应用迁移中不再按 ID 删除默认首页Matt Westcott仅在生产设置中启用ManifestStaticFilesStorage便于跑测试M. Sumair Khokharimport_redirects命令接受以 y 开头的任意确认字符串Matt Westcott起始项目模板调整为把SecurityMiddleware放在首位Brylie Christopher Oxley。编辑器体验侧边栏开启或关闭时键盘操作正确聚焦到新评论含回复Dhruvi Patel可编辑的first_published_at字段草稿值在重载后保留Talha Rizwan可访问性对话框位置随 user bar 位置调整Anees Asghar, Sage AbdullahInlinePanel 标签与标题的大写处理Stefan Hammer从草稿创建的翻译别名页面编辑时正确显示指向源页面的链接Dan Braghis。三、升级注意事项影响所有项目3.1StructBlock的label_format行为变更StructBlock的label_format选项改为块折叠时始终显示块原始的labellabel_format字符串作为摘要显示在其后而不是替换label。如果你之前把label_format设置成包含或等同于label的文本升级时应从label_format字符串中移除原label的文字避免出现重复显示。四、升级注意事项影响 Wagtail 定制代码4.1PageListingButton、SnippetListingButton与UserListingButton弃用这三个类被通用化的ListingButton与Button取代当前仓库中的实现见 wagtail/admin/widgets/button.pyButton的allow_in_dropdown TrueListingButton则渲染为列表顶部按钮。迁移建议若通过register_page_listing_buttonshook 给页面列表添加按钮把wagtail.admin.widgets.PageListingButton换成wagtail.admin.widgets.ListingButton若使用register_snippet_listing_buttons/register_user_listing_buttons将wagtail.snippets.widgets.SnippetListingButton与wagtail.users.widgets.UserListingButton替换为wagtail.admin.widgets.Button按钮出现在列表的 “More” 操作下拉中wagtail.admin.widgets.ListingButton按钮作为列表顶层按钮显示。旧类暂仍可工作但会触发弃用警告并将在未来版本移除。4.2get_list_more_buttons中ListingButton的渲染变化如果你在泛型IndexView子类例如ModelViewSet上覆盖了未公开文档的get_list_more_buttons方法并用ListingButton添加 “More” 下拉按钮——升级后这些按钮会渲染为列表顶层按钮。若仍希望它们留在 “More” 下拉中请改用Button类。4.3init_new_page迁移至wagtail.signals原定义于wagtail.admin.signals的init_new_page信号已移至wagtail.signals引用旧位置的 import 语句需要更新。4.4AccessibilityItem新增in_editor参数user bar 的AccessibilityItem现在接受in_editor参数在页面编辑器内实例化时置为True。如果你自定义过可访问性检查器创建AccessibilityItem子类实例时应传递该参数hooks.register(construct_wagtail_userbar) def replace_userbar_accessibility_item(request, items, page): items[:] [ - CustomAccessibilityItem() CustomAccessibilityItem(in_editoritem.in_editor) if isinstance(item, AccessibilityItem) else item for item in items ]不更新代码仍可工作但in_editor将恒为False。Wagtail 当前未使用该参数未来可能会使用跨域 headless 部署场景也可能依赖它。4.5wagtail.telepath与wagtail.widget_adapters迁移至wagtail.admin.telepathwagtail.telepath模块已移至wagtail.admin.telepathwagtail.widget_adapters移至wagtail.admin.telepath.widgets。引用旧位置的 import 需要更新。迁移后的模块入口为 wagtail/admin/telepath/__init__.py其中定义了WagtailJSContextBase不再把 telepath.js 放入基础 media因为已在admin_base.html全局包含与WagtailAdapterRegistry并保留register、adapter等便捷接口签名与迁移前保持一致多数定制代码仅需改 import 路径。五、升级注意事项未公开内部实现的变更5.1 图片列表的列表视图模板wagtailimages的列表视图模板已适配“列表 网格”双布局。如果你覆盖或复用了这些模板需要把这些适配同步到你的覆盖版本中与 2.3 节的媒体列表改进对应。5.2 移除wagtailadmin/js/telepath/telepath.js该 JS 文件不再需要因为 Telepath 的初始化已移入wagtailadmin/js/core.js。管理后台内的模板应移除对该文件的引用管理后台之外使用 Telepath 的前端代码应改用独立telepath包或telepath-unpack提供的telepath.js。5.3 Tabs 组件前端重写Tabs 组件TabbedInterface等处使用的前端实现已用Stimulus重写原有通过data-tabs属性使用的方式全部失效。发布说明给出的新旧用法对照如下该约定尚未正式文档化可能变化项目用途旧写法新写法属性根 tab 容器 divdata-tabsdata-controllerw-tabs属性tab 触发器tab仅roletabroletab且data-w-tabs-targettrigger contenteditable="false">【免费下载链接】wagtailA Django content management system focused on flexibility and user experience项目地址: https://gitcode.com/GitHub_Trending/wa/wagtail创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表