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

Odoo 14销售订单PDF中CNPJ/CPF标题无法移除的问题求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 06:54:36