如何从ir_config_parameter传递值到qweb视图web.ControlPanel
解决Odoo中向web.ControlPanel视图传递ir.config_parameter参数的问题
问题原因
前端QWeb视图(如web.ControlPanel)运行在浏览器环境中,无法直接访问后端的env对象,所以直接在t-value里写env['ir.config_parameter'].get_param(...)肯定无效。
解决方案(推荐方法:通过JS组件继承传参)
1. 编写JS组件继承ControlPanel
创建static/src/js/control_panel.js文件,通过RPC调用后端获取配置参数,并传递到视图渲染上下文:
odoo.define('your_module.control_panel', function (require) { "use strict"; const ControlPanel = require('web.ControlPanel'); const rpc = require('web.rpc'); ControlPanel.include({ willStart: async function () { await this._super(...arguments); // 调用后端接口获取配置参数 this.wantedParameter = await rpc.query({ model: 'ir.config_parameter', method: 'get_param', args: ['wanted_parameter'], }); }, // 将参数注入渲染上下文 getRenderParams: function () { const params = this._super(...arguments); params.wanted_parameter = this.wantedParameter; return params; }, }); });
2. 在QWeb视图中使用参数
通过继承web.ControlPanel视图,直接使用注入的参数:
<t t-name="web.ControlPanel" t-inherit="web.ControlPanel" t-inherit-mode="extension"> <xpath expr="//div[hasclass('o_control_panel')]" position="inside"> <!-- 示例:展示参数值 --> <div class="o_control_panel_parameter"> 参数值:<span t-esc="wanted_parameter"/> </div> </xpath> </t>
3. 配置资产加载
在模块的__manifest__.py中添加JS文件的加载配置:
'assets': { 'web.assets_backend': [ 'your_module/static/src/js/control_panel.js', ], },
备选方案(全局注入参数,谨慎使用)
如果需要全局给所有视图注入该参数,可以重写后端视图的渲染方法:
from odoo import models class IrUiView(models.Model): _inherit = 'ir.ui.view' def render(self, values=None, engine='ir.qweb', minimal_qcontext=False): values = values or {} # 获取参数并添加到渲染上下文 values['wanted_parameter'] = self.env['ir.config_parameter'].get_param('wanted_parameter') return super().render(values, engine, minimal_qcontext)
这种方法会让所有QWeb视图都能访问wanted_parameter,适合需要全局使用的场景,但可能造成不必要的性能开销。
内容的提问来源于stack exchange,提问作者EMKEJJU
相关产品推荐
相关产品推荐

