Odoo 14销售订单PDF中CNPJ/CPF标题无法移除的问题求助
我在使用Odoo 14时遇到了一个棘手的问题:我想彻底移除销售订单PDF里的CNPJ/CPF标题,目前已经成功删掉了对应的字段数据,但标题“CNPJ/CPF:”仍然顽固地显示在PDF中。
我尝试过两种思路但都没解决问题:
- 用XML继承模板移除相关元素,但Odoo找不到指定的目标元素,甚至直接导致系统崩溃
- 通过自定义模型让
partner_id.vat返回空值,但PDF里的标题依然没有消失
以下是我使用的XML代码:
<?xml version="1.0" encoding="utf-8"?> <odoo> <data> <template id="report_saleorder_controller" inherit_id="sale.report_saleorder_document" priority="20"> <!-- Remove o campo CNPJ/CPF do cliente --> <xpath expr="//span[contains(@t-field, 'partner_id.vat')]" position="replace"/> <!-- Remove blocos originais do parceiro, mas mantém layout seguro --> <xpath expr="//div[contains(@t-field, 'partner_id')]" position="replace"/> <xpath expr="//span[contains(@t-field, 'payment_term_id')]" position="replace"/> <!-- Remove endereço de entrega --> <xpath expr="//div[contains(@t-field, 'partner_shipping_id')]" position="replace"/> <!-- Remove endereço de faturamento --> <xpath expr="//div[contains(@t-field, 'partner_invoice_id')]" position="replace"/> <!-- Remove a coluna "Taxes" (cabeçalho) --> <xpath expr="//th[@name='th_taxes']" position="replace"/> </template> </data> </odoo>
系统日志显示找不到partner_id.vat相关的元素,前端XML修改和后端模型调整两种方式都碰了壁。有没有人能指导我如何彻底移除这个标题?
补充上下文:我使用的是Odoo 14,两种方法都试过,日志始终提示找不到目标字段元素。
[PDF中CNPJ/CPF标题的截图]
嗨,我之前也碰到过类似的问题,Odoo的QWeb模板定位特别需要精准匹配,你遇到的问题主要是xpath定位不准确,加上对原模板结构不够清晰导致的,下面给你几个可行的解决思路:
1. 精准定位CNPJ/CPF的标题容器
在Odoo 14的sale.report_saleorder_document原模板里,CNPJ/CPF的标题和字段通常包裹在同一个<div>里,结构大概是这样的:
<div class="col-6"> <strong t-if="doc.partner_id.vat">CNPJ/CPF: </strong> <span t-field="doc.partner_id.vat"/> </div>
你之前只替换了<span>字段,但标题是<strong>标签,而且原模板里的t-field是带doc.前缀的,所以你的xpath//span[contains(@t-field, 'partner_id.vat')]其实没匹配到正确元素。
试试用下面的XML代码,直接定位包含标题的整个容器:
<?xml version="1.0" encoding="utf-8"?> <odoo> <data> <template id="custom_report_saleorder_remove_cnpj" inherit_id="sale.report_saleorder_document" priority="20"> <!-- 移除包含CNPJ/CPF标题和字段的整个div --> <xpath expr="//div[contains(., 'CNPJ/CPF:')]" position="replace"/> <!-- 如果你只想单独移除标题(不需要的话可以忽略),可以用: <xpath expr="//strong[text()='CNPJ/CPF: ']" position="replace"/> --> </template> </data> </odoo>
这个xpath通过文本内容定位容器,比用t-field更可靠,毕竟不同本地化模块可能会修改模板结构。
2. 用开发者模式确认原模板结构
建议你开启开发者模式,进入设置 > 技术 > 视图 > QWeb模板,搜索sale.report_saleorder_document,查看原模板的具体代码,确认CNPJ/CPF部分的准确结构。有时候巴西本地化模块会修改这个模板,导致结构和默认版本不一样,这时候你需要根据实际结构调整xpath。
3. 为什么后端修改没生效?
你尝试让partner_id.vat返回空值但标题仍显示,大概率是原模板里的t-if条件没有生效。默认模板里标题是带t-if="doc.partner_id.vat"判断的,如果vat为空,标题应该不会显示。如果还是显示,可能是:
- 你的后端修改没有正确覆盖vat字段,比如没继承
res.partner模型或没正确升级模块 - 本地化模块修改了模板,移除了
t-if判断,标题变成了硬编码显示
这种情况下,用XML继承修改模板的方式反而更直接可靠。
4. 避免过度替换元素
你之前的代码里用了//div[contains(@t-field, 'partner_id')],这个xpath会匹配所有包含partner_id的div,替换后会直接破坏整个客户信息区域的布局,导致系统崩溃,所以一定要精准定位目标元素,别用太宽泛的xpath。
试试上面的方法,应该能解决你的问题,如果还是不行,你可以把原模板里CNPJ/CPF部分的代码贴出来,我再帮你调整xpath。
内容来源于stack exchange

