十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Wagtail 6.0.2 发布说明深度解析:Chooser 模态框、ModelViewSet 与 TableBlock 的 8 项关键修复

Wagtail 6.0.2 发布说明深度解析:Chooser 模态框、ModelViewSet 与 TableBlock 的 8 项关键修复 Wagtail 6.0.2 发布说明深度解析Chooser 模态框、ModelViewSet 与 TableBlock 的 8 项关键修复【免费下载链接】wagtailA Django content management system focused on flexibility and user experience项目地址: https://gitcode.com/GitHub_Trending/wa/wagtailWagtail 6.0.2 发布于 2024 年 4 月 3 日是 Wagtail 6.0 系列的首个补丁版本继 6.0.1 之后聚焦于修复 6.0 大版本引入通用 class-based views 与 Universal listings 重构后遗留的回归问题。本文以官方发布说明 docs/releases/6.0.2.md 为主体逐一拆解 8 项 bug fix 与 1 项文档修复的根因、修复方式与底层源码逻辑并给出你在自定义ModelViewSet、页面模板或表格块时可复用的实践结论。阅读本文后你将理解 Wagtail 6.0 时代 admin 前端 JavaScript 的加载模型、get_add_url()的调用链以及这些修复对第三方包兼容性的真实影响。6.0.2 在 Wagtail 6.0 系列中的位置要理解 6.0.2 的修复内容首先需要回顾它的上下文。Wagtail 6.0docs/releases/6.0.md于 2024 年 2 月 7 日发布是一次包含大量重构的大版本支持 Django 5.0并移除了对 Django 4.2 以下版本的支持引入Universal listings页面、Snippet、表单的统一搜索与筛选界面全面铺开generic class-based views重构文档、图片、表单页、Snippet 的列表视图全部迁移到通用IndexView页面的 explorer 索引模板也改为继承通用模板新增SnippetViewSet/ModelViewSet的 copy 视图默认启用可用copy_view_enabled False关闭引入新的 Tippy dropdown-button、Stimulus 控制器体系替换大量 jQuery 内联脚本。6.0.1docs/releases/6.0.1.md只包含 3 项小修复BooleanRadioSelect样式、ManifestStaticFilesStorage下的collectstatic失败、Elasticsearch 下空搜索提交报错。而 6.0.2 的 8 项修复则主要围绕通用视图viewsets与 Chooser 模态框的 JavaScript/样式回归——这正是 6.0 重构波及面最广的区域。可以看到6.0.2 的三位主要贡献者Sage Abdullah、LB (Ben) Johnston恰是 6.0 中通用视图与模板重构的核心作者说明这些修复本质上是重构后的自纠。Bug fixes 逐项解析1. 侧边栏打开不再影响模态标签页宽度Ensure that modal tabs width are not impacted by side panel opening在页面编辑器的“Checks”等侧边栏side panel展开时Chooser 模态框内的标签页tabs宽度会受到影响出现布局抖动。6.0.2 通过调整模态框内标签页的样式作用域将标签页宽度与侧边栏开合状态解耦确保模态框内部的 tab 布局稳定。这是典型的 CSS 回归问题6.0 中引入的侧边栏组件与模态框共用某些布局上下文导致一侧状态变化影响另一侧。该修复对应 admin 内 chooser 模态相关的 SCSS 样式调整见 client/scss 下 components 目录的 chooser 相关样式。2.make livehtml本地文档开发问题Resolve issue local development of docs when runningmake livehtmlWagtail 的文档使用 Sphinx 构建本地实时预览通过docs/Makefile中的livehtml目标实现livehtml: sphinx-autobuild --port 4000 --host 0.0.0.0 -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html6.0.2 修复了运行make livehtml时的报错同时将文档主题升级到 Sphinx Wagtail Theme 6.3.0见下文 Documentation 部分确保贡献者在本地构建文档时能正常工作。文档的完整构建方式可参考 docs/README.md。3. Chooser 模态列表多余的 paddingResolve issue with unwanted padding in chooser modal listings与第 1 项同属 chooser 模态框的样式回归Chooser 模态框内的对象列表listing在 6.0 的列表样式重构后出现了多余的 padding。6.0.2 将其移除恢复紧凑的列表布局。4. 列表刷新时始终用get_add_url()重渲染添加按钮Ensureget_add_url()is always used to re-render the add button when the listing is refreshed in viewsets这是 6.0.2 中最具工程启示意义的一项修复涉及通用IndexView的 URL 生成机制。在 wagtail/admin/views/generic/models.py 中IndexView通过get_add_url()方法统一生成添加按钮的 URL并缓存为add_url属性def get_add_url(self): if self.add_url_name and self.user_has_permission(add): return self._set_locale_query_param(reverse(self.add_url_name)) cached_property def add_url(self): return self.get_add_url()该方法的特殊之处在于_set_locale_query_param当 i18n 开启时它会在 add URL 上附加当前 locale 的查询参数确保在翻译站点中新建对象时自动继承当前语言上下文。get_add_url()的结果进一步驱动header_buttonsmodels.py中add_button的渲染并同时做权限检查user_has_permission(add)。6.0 之前部分 listing 刷新路径尤其是 AJAX 刷新通用列表时直接硬编码或使用旧逻辑渲染 add 按钮绕过了get_add_url()导致在多语言环境下刷新列表后新建按钮丢失 locale 参数或者在不具备 add 权限时仍显示按钮。6.0.2 统一修正为列表刷新包括index_results.html模板的局部刷新一律调用get_add_url()重渲染保证 URL 与权限判定逻辑始终一致。实践结论如果你自定义了ModelViewSet或SnippetViewSet并覆写了add_url_name或实现了自定义的get_add_url()在 6.0.2 上请确认列表局部刷新仍会正确走到该方法这是该版本修复的既定契约。5.modal-workflow.js移入基础 admin 模板Chooser 在ModelViewSet中可用Movemodal-workflow.jsscript usage to base admin template instead of ad-hoc imports so that choosers work inModelViewSets这是 6.0.2 最重要的一项 JavaScript 架构修复。Wagtail 的 Chooser选择器模态框依赖modal-workflow.js提供的ModalWorkflow框架。在 6.0 之前该脚本通过各视图模板的 ad-hoc 方式引入例如仅在特定 chooser 模板中{% block extra_js %}引入导致任何遗漏引入该脚本的视图尤其是新的通用ModelViewSet视图中Chooser 无法正常弹出。6.0.2 将modal-workflow.js的引用移入基础 admin 模板使其对全部 admin 页面生效。当前仓库中 wagtail/admin/templates/wagtailadmin/admin_base.html 第 30 行可见script src{% versioned_static wagtailadmin/js/modal-workflow.js %}/script该行位于admin_base.html的{% block js %}块内与 jQuery、jQuery UI、datetimepicker、bootstrap-modal、core.js、wagtailadmin.js、sidebar.js 等脚本并列属于每个 admin 页面包括所有ModelViewSet渲染的页面都必然加载的基础脚本。底层支撑逻辑在 wagtail/admin/views/generic/chooser.py 中chooser 视图通过render_modal_workflow(...)返回模态框响应该函数来自 wagtail/admin/modal_workflow.py。ModalWorkflow负责在模态框中加载 iframe/URL、处理确认与取消回调。修复前如果某个ModelViewSet的创建/编辑页面没有单独引入modal-workflow.jschooser 点击后会因window.ModalWorkflow未定义而静默失败修复后基础模板保证脚本全局可用。实践结论如果你开发第三方 Wagtail 包并在自定义视图中使用 chooser6.0.2 起无需再自行引入modal-workflow.js——基础模板已覆盖所有 admin 页面。若你的自定义页面继承自skeleton.html而非admin_base.html则仍需自行处理。6.ModelViewSet创建/编辑视图默认包含通用控件 JavaScript如InlinePanelEnsure JavaScript for common widgets such asInlinePanelis included by default inModelViewSets create and edit views6.0 为ModelViewSet引入了通过panels/edit_handler定义表单面板的能力见 docs/releases/6.0.md 的 Add support for definingpanels/edit_handleronModelViewSet。但通用CreateView/EditViewwagtail/admin/views/generic/models.py在渲染这些面板时最初没有像页面编辑那样自动聚合面板内 widget 的MediaJavaScript/CSS 资源。InlinePanel这类面板依赖额外的 JS 才能渲染添加/删除内联项交互。如果CreateView/EditView没有把面板表单的media合并进模板输出用户使用ModelViewSet编辑含InlinePanel的模型时会发现内联控件完全不可用按钮点击无效。6.0.2 确保通用创建/编辑视图默认将面板中 widget 声明的 JavaScript 包含进页面输出form.media聚合逻辑使InlinePanel等通用控件在ModelViewSet中开箱即用无需额外配置。实践结论在 6.0.2 上只要你的ModelViewSet通过panels声明了InlinePanel或其他带Media的 widget相关 JS 会自动加载。7. 恢复页面创建/编辑模板中extra_footer_actions块的自定义样式Reinstate styles for customizations ofextra_footer_actionsblock in page create/edit templatesextra_footer_actions是一个未在文档中公开但被多个第三方包使用的模板块用于在页面创建/编辑表单的动作按钮区域即保存/发布按钮所在处添加额外的操作按钮。在 wagtail/admin/templates/wagtailadmin/pages/create.html 中可见其定义{% block actions %} {{ action_menu.render_html }} {% block extra_footer_actions %} {% comment %} While undocumented, this block is used by some packages to add additional actions *outside* of the dropdown menu. {% endcomment %} {% endblock %} {% endblock %}注意模板中的注释明确承认该块虽未文档化但被一些包用于在下拉菜单之外添加额外操作。Wagtail 6.0 重构页面创建/编辑模板的动作区域样式时统一 header 按钮样式、改用新 action menu 组件丢失了针对extra_footer_actions内自定义内容的样式导致第三方包添加的按钮排版错乱。6.0.2 恢复了相应样式保证自定义 footer 动作与官方动作菜单视觉一致。实践结论extra_footer_actions是官方承认但未文档化的扩展点。如果你的项目或依赖包在页面创建/编辑表单添加了额外底部操作按钮升级到 6.0.2 可恢复其正确样式。8. 编辑器加载空表格块TableBlock不再崩溃Prevent crash when loading an empty table block in the editorTableBlock表格块是 Wagtail 内置的流式字段块其编辑器基于 Handsontable 实现。在 wagtail/contrib/table_block/blocks.py 中可以看到完整的实现TableInputblocks.py继承自forms.HiddenInput其media属性声明了 Handsontable 的 CSS 与 JS 资源table_block/css/vendor/handsontable-6.2.2.full.min.css、table_block/js/vendor/handsontable-6.2.2.full.min.js、table_block/js/table.jsTableInputAdapterblocks.py通过 telepath 注册js_constructor wagtail.widgets.TableInput负责把table_options与可翻译字符串传给前端构造器。6.0.2 修复的崩溃场景是当用户在编辑器中加载一个尚未有任何数据的 TableBlock例如刚添加块、或数据库中存储的表格数据为空时前端table.js在初始化 Handsontable 的过程中对空数据做了解析/索引访问导致 JavaScript 异常、编辑器崩溃。修复后在空表格数据的情况下也能安全初始化渲染出默认的空表格供编辑。实践结论如果你的站点大量使用TableBlock且内容可能留空未填写任何单元格升级 6.0.2 是必要的——旧版本在编辑这类块时存在崩溃风险。此外注意 6.0 起 TableBlock 的 caption 与空表头th的可访问性行为均已改善见 docs/releases/6.0.md 的 accessibility improvements。DocumentationSphinx 主题升级至 6.3.0Update Sphinx theme to6.3.0with a fix for the missing favicon6.0.2 同步将文档使用的 Sphinx Wagtail Theme 升级到 6.3.0修复了文档站点 favicon 缺失的问题此前 6.0 已尝试通过升级到 6.2.0 修复但未完全解决。当前文档的构建配置可参考 docs/conf.pyfavicon 文件位于 docs/favicon.ico48x48 像素Logo 位于 docs/logo.png。升级建议与验证要点综合 6.0.2 的修复内容升级到该版本后建议按以下清单验证ModelViewSet / SnippetViewSet确认含InlinePanel等通用控件的创建/编辑页面 JS 正常加载chooser 控件如外键选择可正常弹出多语言站点在非默认 locale 下刷新通用列表确认添加按钮仍携带正确的 locale 参数对应get_add_url()修复页面编辑表单如果依赖包使用extra_footer_actions块检查底部自定义按钮样式是否恢复正常TableBlock在编辑器中加载一个从未填写过数据的空表格块确认不再崩溃文档开发本地运行make livehtml验证文档实时构建正常。从发布节奏看6.0.2 的修复集中在 6.0 重构波及的通用视图、chooser 模态与表格编辑器三类区域其后的 6.0.3 还补充了 MariaDB UUID 转换的convert_mariadb_uuids管理命令见 docs/releases/6.0.md 的 upgrade considerations。如果你的项目正处于 5.2 LTS 向 6.0 迁移的阶段建议直接采用包含 6.0.1/6.0.2 全部修复的最新 6.0.x 补丁版本以规避上述回归问题。【免费下载链接】wagtailA Django content management system focused on flexibility and user experience项目地址: https://gitcode.com/GitHub_Trending/wa/wagtail创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表