Odoo 15创建新支付方式触发AttributeError错误求助
问题分析
报错核心是AttributeError: 'NoneType' object has no attribute 'get',触发点在代码的information.get('mode')行。这说明information变量为None,也就是调用methods_info.get(method.code)时,没有找到对应支付方式code的配置信息。
_get_payment_method_information()是Odoo框架规定的、用于返回支付方法配置元信息的方法,所有自定义或第三方支付方式都需要在对应的模型类中重写该方法,返回包含mode等必要键的字典。如果新支付方式未正确注册该配置,就会出现此错误。
解决方案
1. 补全支付方式的配置信息注册
如果是自定义支付方式,确保你的模型类(继承自account.payment.method)正确重写_get_payment_method_information方法,示例代码如下:
class AccountPaymentMethodCustom(models.Model): _inherit = 'account.payment.method' @api.model def _get_payment_method_information(self): res = super()._get_payment_method_information() # 替换为你的支付方式code和对应配置 res['custom_payment_code'] = { 'mode': 'multi', # 根据需求选择'multi'或'single' 'payment_type': 'inbound', # 或'outbound',对应收/付款类型 } return res
如果是第三方模块提供的支付方式,检查该模块是否遗漏了此方法的实现,若存在bug,可手动在模块中补全上述逻辑。
2. 临时修复核心代码(应急方案)
若暂时无法修改第三方模块,可在报错的核心代码中增加空值判断,避免程序崩溃:
修改/cityvape/cityvape-server/addons/account/models/account_payment_method.py中的create方法:
@api.model_create_multi def create(self, vals_list): payment_methods = super().create(vals_list) methods_info = self._get_payment_method_information() for method in payment_methods: information = methods_info.get(method.code) # 增加information非空判断,仅当配置存在时执行后续逻辑 if information and information.get('mode') == 'multi': method_domain = method._get_payment_method_domain() journals = self.env['account.journal'].search(method_domain) self.env['account.payment.method.line'].create([{ 'name': method.name, 'payment_method_id': method.id, 'journal_id': journal.id } for journal in journals]) return payment_methods
注意:修改Odoo核心模块代码并非最佳实践,仅作为临时应急方案,优先推荐修复第三方/自定义模块的配置注册逻辑。
3. 验证支付方式code的一致性
确认你创建支付方式时填写的code字段值,与_get_payment_method_information中注册的code完全一致(大小写敏感)。
排查步骤
- 查看新创建支付方式的
code字段具体值 - 在Odoo shell中执行
self.env['account.payment.method']._get_payment_method_information(),检查返回字典中是否包含该code - 检查第三方模块的支付方式模型是否正确继承
account.payment.method并实现_get_payment_method_information方法
内容的提问来源于stack exchange,提问作者Yassine Haoufadi

