如何通过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
相关产品推荐
相关产品推荐

