You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo中继承ExportXlsxWriter的__init__方法未执行,求解决

解决Odoo中自定义ExportXlsxWriter的__init__方法未被调用的问题

你的自定义__init__方法没被触发,核心原因是Odoo在导出Excel时,依然使用原ExportXlsxWriter类实例化,而非你定义的子类。以下是两种可行的解决方案:

方案一:使用猴子补丁直接覆盖原方法

不需要创建子类,直接修改原类的__init__方法,确保所有实例化都会执行你的自定义逻辑:

from odoo.addons.web.controllers.main import ExportXlsxWriter

# 先保存原类的__init__方法,避免覆盖后丢失原有逻辑
original_init = ExportXlsxWriter.__init__

def custom_xlsx_init(self, field_names, row_count=0):
    # 这里添加你的自定义逻辑
    print('Local::::::::::::::::')
    # 调用原类的__init__方法,保留原有功能
    original_init(self, field_names, row_count=row_count)

# 替换原类的__init__方法
ExportXlsxWriter.__init__ = custom_xlsx_init

方案二:继承导出控制器,替换Writer实例

找到Odoo中创建ExportXlsxWriter实例的位置,通过继承核心导出控制器,重写对应方法返回你的自定义类实例:

from odoo.addons.web.controllers.main import ExportController, ExportXlsxWriter

# 定义自定义Writer子类
class CustomExportXlsxWriter(ExportXlsxWriter):
    def __init__(self, field_names, row_count=0):
        print('Local::::::::::::::::')
        super().__init__(field_names, row_count=row_count)

# 继承原导出控制器,重写创建Writer的方法
class CustomExportController(ExportController):
    def _get_xlsx_writer(self, field_names, row_count=0):
        # 返回自定义Writer实例,替代原类
        return CustomExportXlsxWriter(field_names, row_count=row_count)

关键注意事项

  • 模块依赖:确保你的模块在__manifest__.py中声明依赖web模块('depends': ['web']),保证加载顺序正确。
  • 版本适配:不同Odoo版本中,ExportXlsxWriter的调用方法名可能不同(比如有些版本是在export_xlsx方法中直接实例化),需要查看对应版本的web/controllers/main.py代码调整。
  • 猴子补丁风险:如果后续Odoo官方更新了ExportXlsxWriter的__init__方法,你需要同步检查并调整自定义逻辑,避免冲突。

内容的提问来源于stack exchange,提问作者Ila Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:18:25