Odoo视图继承报错:无法定位指定XPath元素求助
首先先明确你遇到的报错信息:
Element '<xpath expr="//form/footer/button[@name='create_payment']" name="">' cannot be located in parent view Error context: View
account.register.payments.wizard.from.invoices.inherited[view_id: 660, xml_id: account_bankgiro_payment_file.view_account_payment_from_invoices_inherit_account_bankgiro, model: account.register.payments, parent_id: 384] None" while parsing /home/prachh/odoo-new/11/apps/account_bankgiro_payment_file/views/inherited_account_register_payments.xml:11
这个报错核心是:你写的继承视图(view_account_payment_from_invoices_inherit_account_bankgiro)里的XPath表达式,找不到父视图(account.register.payments的原始视图,ID为384)中对应的按钮元素。结合你提供的代码,我给你一步步排查的思路:
1. 先确认父视图的真实结构
你需要先搞清楚被继承的原始视图到底长什么样:
- 登录Odoo后台,进入设置 > 技术 > 用户界面 > 视图,搜索模型
account.register.payments,找到ID为384的那个视图。 - 查看它的XML结构,确认
form/footer下是否真的存在name="create_payment"的按钮。
有可能父视图里这个按钮的name属性不是create_payment(比如是action_create_payments),或者按钮根本不在footer容器里,这都会导致你的XPath找不到元素。
2. 检查缺失的继承视图代码
你提供的代码里没有包含报错提到的inherited_account_register_payments.xml第11行的内容,这部分是问题的关键,你需要重点检查:
- XPath的引号转义问题:XML里如果XPath表达式内部用了单引号,外层要改用双引号(或者反过来),比如正确写法应该是:
或者<xpath expr="//form/footer/button[@name="create_payment"]" position="replace">
如果内外层用了相同的引号,会导致XML解析错误,XPath表达式直接失效。<xpath expr='//form/footer/button[@name="create_payment"]' position="inherit"> - 继承关系是否正确:确认你的继承视图的
parent_id确实指向了account.register.payments的原始表单视图,而不是其他视图。
3. 检查模块依赖与加载顺序
- 打开你的模块的
__manifest__.py,确认已经把account模块添加到depends列表里——因为account.register.payments是account模块的模型,必须确保它的视图先于你的模块加载。 - 如果你的继承逻辑依赖了其他模块对该视图的修改,还要确保那些模块在你的模块之前加载。
4. 修复现有代码里的语法错误
从你提供的代码里发现一个明显的语法问题:最后一个视图view_account_bankgiro_payment_form的结尾是不完整的</fiel,应该改成</field>,还要补上</record>闭合标签。这个错误可能会导致整个模块的视图解析异常,进而影响其他视图的加载,建议先修复:
<!-- 修复前 --> </fiel <!-- 修复后 --> </field> </record>
临时调试技巧(如果以上都没解决)
如果还是找不到问题,可以临时加一段代码打印父视图的完整XML结构,帮你确认目标元素的位置:
from odoo import models class AccountRegisterPayments(models.Model): _inherit = 'account.register.payments' def init(self): # 替换384为报错里的parent_id parent_view = self.env['ir.ui.view'].browse(384) print(parent_view.arch)
执行这个方法后,你就能看到父视图的完整XML,直接确认目标按钮的真实位置和属性。
内容的提问来源于stack exchange,提问作者Pragya Chhabra

