Odoo 16项目模块看板示例修改:自定义Registry不知如何使用
Odoo 16 自定义项目看板示例Registry使用指南
核心问题解决思路
你已经完成了自定义看板示例的Registry注册,现在需要让项目模块的看板组件正确加载并识别这个Registry,关键在于完成JS文件的模块加载配置、示例与项目模型的绑定,以及必要时的组件继承调整。
步骤1:确保自定义JS文件被模块加载
在你的自定义模块__manifest__.py中,将JS文件添加到后端资源列表,让Odoo在加载后台页面时自动引入:
'assets': { 'web.assets_backend': [ 'restructure_inherit_views/static/src/js/your_kanban_example.js', ], },
替换your_kanban_example.js为你的实际JS文件名,保证文件路径与模块内的静态资源结构一致。
步骤2:绑定示例到项目任务模型
Odoo的看板示例会根据当前视图的模型自动匹配,你需要在示例数据中添加model字段,明确关联project.task模型:
const exampleData = { model: 'project.task', // 新增该行,绑定到项目任务模型 ghostColumns: [_lt("New"), _lt("Assigned"), _lt("In Progress"), _lt("Done"), ], applyExamplesText: _lt("Use This For My Project"), allowedGroupBys: ["stage_id"], examples: [{ name: _lt("New Custom Example"), columns: [_lt("Brainstorm"), _lt("Research"), _lt("Draft"), _lt("Final Document"), ], get description() { return renderToMarkup("project.example.researchproject"); }, bullets: [greenBullet, redBullet], }, ], };
完成此配置后,打开项目任务看板时,系统会自动加载该模型关联的看板示例。
步骤3:(可选)继承看板控制器自定义示例逻辑
如果需要替换原有项目看板示例,或者合并自定义示例与原有示例,可继承项目看板控制器并重写示例获取方法:
odoo.define("restructure_inherit_views.extend_project_kanban", function(require) { "use strict"; const registry = require('@web/core/registry'); const projectKanbanController = registry.category('controllers').get('project.kanban'); const CustomProjectKanbanController = projectKanbanController.extend({ async _getKanbanExamples() { // 获取自定义示例 const customExample = registry.category('kanban_examples').get('custom_project'); // 直接返回自定义示例(替换原有) return [customExample]; // 若需合并原有示例,取消下方注释: // const originalExamples = await this._super(...arguments); // return [...originalExamples, customExample]; }, }); // 覆盖原有项目看板控制器 registry.category('controllers').add('project.kanban', CustomProjectKanbanController, {force: true}); });
验证与测试
- 升级你的自定义模块
- 打开任意项目的任务看板,点击右上角的「示例」按钮(若看板已有数据,可暂时清空或切换视图后重新打开)
- 检查是否出现「New Custom Example」选项,点击后验证看板列是否按配置更新
注意事项
- 确保
project.example.researchproject对应的QWeb模板存在,可在模块static/src/xml目录下创建模板文件,并在__manifest__.py的qweb字段中添加模板路径 - 使用控制器继承时,
force: true参数会覆盖原有控制器逻辑,若需保留原有功能,务必调用_super方法
内容的提问来源于stack exchange,提问作者Harvey Specter
相关产品推荐
相关产品推荐

