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

如何通过QWeb继承修改Odoo DIN5008的information_block并区分文档类型?

解决DIN5008报表information_block字段添加问题(仅QWeb继承)

1. 不要继承业务报表模板,直接继承external_layout_din5008

报价单(sale.order)和发票(account.move)的DIN5008格式报表都是引用account.external_layout_din5008这个通用布局模板,所以直接继承这个模板才是正确的姿势,不用单独继承report_saleorder_document或report_invoice_document。

示例基础继承结构:

<odoo>
  <template id="custom_din5008_layout" inherit_id="account.external_layout_din5008">
    <!-- 后续XPATH修改写在这里 -->
  </template>
</odoo>

2. 精准定位information_block的XPATH写法

之前XPATH失效是因为路径不对,直接用节点类名定位即可,以下是几种常用定位方式:

方式1:直接定位整个信息区块

<xpath expr="//div[@class='information_block']" position="inside">
  <!-- 在区块内追加内容 -->
</xpath>

方式2:定位客户信息列(左侧第一列)

如果要在客户信息区域插入字段,用这个更精准:

<xpath expr="//div[@class='information_block']/div[hasclass('row')]/div[hasclass('col-6')][1]" position="inside">
  <!-- 插入客户相关字段 -->
</xpath>

比如添加客户编号的完整代码:

<xpath expr="//div[@class='information_block']/div[hasclass('row')]/div[hasclass('col-6')][1]" position="inside">
  <div class="row mt16">
    <div class="col-4 text-right">
      <span class="text-muted">客户编号:</span>
    </div>
    <div class="col-8">
      <span t-field="o.partner_id.ref" t-if="o.partner_id.ref"/>
      <span t-if="not o.partner_id.ref">无</span>
    </div>
  </div>
</xpath>

3. 区分报价单和发票的文档类型

因为external_layout_din5008是共用模板,要区分两种文档,直接判断当前记录的模型即可:

按模型区分

<!-- 仅报价单显示 -->
<t t-if="o._name == 'sale.order'">
  <div class="row mt16">
    <div class="col-4 text-right">
      <span class="text-muted">报价有效期:</span>
    </div>
    <div class="col-8">
      <span t-field="o.validity_date" t-format="%Y-%m-%d"/>
    </div>
  </div>
</t>

<!-- 仅发票显示 -->
<t t-if="o._name == 'account.move'">
  <div class="row mt16">
    <div class="col-4 text-right">
      <span class="text-muted">到期日期:</span>
    </div>
    <div class="col-8">
      <span t-field="o.invoice_date_due" t-format="%Y-%m-%d"/>
    </div>
  </div>
</t>

按报表ID区分(更精准)

如果要区分具体的报表(比如普通发票和贷记单),可以用上下文里的report_name:

<t t-if="report_name == 'sale.report_saleorder_document'">
  <!-- 专属报价单报表的内容 -->
</t>
<t t-if="report_name == 'account.report_invoice_document'">
  <!-- 专属发票报表的内容 -->
</t>

完整可复用代码

<odoo>
  <template id="custom_din5008_information_fields" inherit_id="account.external_layout_din5008">
    <!-- 在客户信息列添加字段 -->
    <xpath expr="//div[@class='information_block']/div[hasclass('row')]/div[hasclass('col-6')][1]" position="inside">
      <!-- 公共字段:客户编号 -->
      <div class="row mt16">
        <div class="col-4 text-right">
          <span class="text-muted">客户编号:</span>
        </div>
        <div class="col-8">
          <span t-field="o.partner_id.ref" t-if="o.partner_id.ref"/>
          <span t-if="not o.partner_id.ref">无</span>
        </div>
      </div>

      <!-- 报价单专属字段 -->
      <t t-if="o._name == 'sale.order'">
        <div class="row mt16">
          <div class="col-4 text-right">
            <span class="text-muted">报价有效期:</span>
          </div>
          <div class="col-8">
            <span t-field="o.validity_date" t-format="%Y-%m-%d"/>
          </div>
        </div>
      </t>

      <!-- 发票专属字段 -->
      <t t-if="o._name == 'account.move'">
        <div class="row mt16">
          <div class="col-4 text-right">
            <span class="text-muted">到期日期:</span>
          </div>
          <div class="col-8">
            <span t-field="o.invoice_date_due" t-format="%Y-%m-%d"/>
          </div>
        </div>
      </t>
    </xpath>
  </template>
</odoo>

关键注意点

  • 模块必须依赖account和sale模块(在__manifest__.py的depends里添加)
  • 测试前要确保报表设置为DIN5008格式:进入对应业务单据的打印设置,选择“DIN5008”布局
  • 如果XPATH还是定位失败,打开Odoo的报表预览(HTML模式),用浏览器开发者工具查看节点结构,复制准确的XPATH路径

内容的提问来源于stack exchange,提问作者Crazor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:20:54