Odoo 16发票门户视图添加签名按钮失败问题排查
问题排查方向
1. 视图继承目标与模块依赖问题
- 你当前继承的
account_payment.portal_invoice_page_inherit_payment是account_payment模块对基础门户发票视图的继承,若自定义模块的__manifest__.py未添加'depends': ['account', 'account_payment', 'portal'],会直接导致视图继承失效。 - 建议先尝试直接继承基础视图
account.portal_invoice_page,规避多层继承的加载顺序问题,修改inherit_id配置:<field name="inherit_id" ref="account.portal_invoice_page"/>
2. XPath定位表达式不准确
- 你使用的
//div[contains(@class, 'd-grid')]/a[contains(@class, 'btn-primary')]可能匹配不到目标元素:- 门户发票页的"Pay Now"按钮可以通过文本精确匹配,修改XPath为:
<xpath expr="//a[contains(text(), 'Pay Now')]" position="after"> - 也可以直接查看目标视图的DOM结构,确认
div.d-grid下的a.btn-primary是否存在,避免因class组合变更导致定位失败。
- 门户发票页的"Pay Now"按钮可以通过文本精确匹配,修改XPath为:
3. 视图权限与加载配置问题
- 确保自定义视图给
portal组开放了访问权限,在安全文件中添加配置示例:<record id="group_portal" model="res.groups"> <field name="implied_ids" eval="[(4, ref('your_module.group_your_portal_signature'))]"/> </record> - 门户视图属于
page类型,可在视图记录中明确声明:<field name="type">page</field>
4. 签名UMD触发的逻辑缺失
- 你的代码仅实现了按钮和模态框的UI,但没有处理点击"Save Signature"后触发发票模型Signature UMD的核心逻辑:
- 需要添加JavaScript代码,获取画布签名数据并调用Odoo RPC方法,示例:
document.getElementById('saveSignatureModal').addEventListener('click', function() { const canvas = document.getElementById('signatureCanvas'); const signatureData = canvas.toDataURL(); const invoiceId = parseInt(document.querySelector('.invoice-id').dataset.id); odoo.rpc.call('account.move.trigger_signature_umd', [[invoiceId], {signature: signatureData}]) .then(function(result) { if (result) { $('#signatureModal').modal('hide'); window.location.reload(); } }); }); - 同时要在
account.move模型中定义trigger_signature_umd方法,完成签名保存和UMD触发的业务逻辑。
- 需要添加JavaScript代码,获取画布签名数据并调用Odoo RPC方法,示例:
内容的提问来源于stack exchange,提问作者Mark Silla
相关产品推荐
相关产品推荐

