如何在Odoo 18中阻止原生_delete_coordinates onchange方法执行?
解决Odoo中阻止
_delete_coordinates onchange方法运行的问题 1. 修正重写代码的语法错误
你当前重写的代码存在语法错误:@api.onchange装饰器的参数列表里,'city'和'state_id'之间缺少逗号,这会导致Python解析失败,Odoo无法正确加载你的重写方法,原方法自然会继续执行。
正确的重写代码应为:
@api.onchange('street', 'zip', 'city', 'state_id', 'country_id') def _delete_coordinates(self): pass
2. 确保模块加载顺序正确
如果修正语法后问题依旧,需要确认你的模块在原方法所在模块之后加载:
- 在模块的
__manifest__.py文件中,将原方法所属的模块添加到depends列表中,确保Odoo先加载原模块,再加载你的模块,这样重写方法才能覆盖原方法。
示例__manifest__.py片段:
{ 'name': '你的模块名称', 'depends': ['base', '原模块名称'], # 替换为实际的原模块名 # 其他配置项... }
3. 强制移除原方法的onchange绑定
如果以上方法无效,可以通过模块初始化钩子直接移除原方法的onchange注册:
在模块的__init__.py中添加如下代码:
from odoo import api, models from odoo.addons.原模块名称.models.模型名称 import 模型类名称 def _post_init_hook(cr, registry): # 移除原方法的onchange绑定 if hasattr(模型类名称, '_onchange_methods'): model_onchanges = 模型类名称._onchange_methods keys_to_remove = [] for key, methods in model_onchanges.items(): for method in methods: if method.__name__ == '_delete_coordinates': keys_to_remove.append((key, method)) for key, method in keys_to_remove: model_onchanges[key].remove(method) # 注册初始化钩子 api.post_init(_post_init_hook)
注意替换代码中的原模块名称、模型名称、模型类名称为实际名称。
4. 替代方案:修改触发字段(可选)
若不需要完全阻止该方法,只是不想让指定字段触发它,可以重写装饰器的触发字段列表,甚至留空(不建议留空,避免意外):
@api.onchange() # 空列表表示无触发字段,方法不会被触发 def _delete_coordinates(self): pass
内容的提问来源于stack exchange,提问作者damar
相关产品推荐
相关产品推荐

