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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 14:04:50