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
相关产品推荐
相关产品推荐

