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

Odoo 10产品内部参考未同步至发票报表问题求助(附代码)

解决Odoo 10销售订单行内部参考字段同步至发票报表的问题

我来帮你一步步解决这个问题,咱们从代码调整到报表修改逐一排查:

先修正销售订单行的继承代码

你写的销售订单行代码有几个小细节需要调整,避免不必要的冲突:

  • 当你只是想扩展现有模型时,不需要重写_name(只有创建全新模型时才需要),只保留_inherit就行,不然可能会导致模型继承异常。
  • 你的partner_name字段定义有问题,应该关联到订单对应的合作伙伴名称,而不是直接写partner_id.name。

修正后的销售订单行代码:

from odoo import models, fields

class SaleOrderLine(models.Model):
    _inherit = 'sale.order.line'

    x_field = fields.Float('Unit cost')
    internal_ref = fields.Char(related='product_id.default_code', string='Internal reference product', store=True)
    # 修正合作伙伴名称的关联逻辑
    partner_name = fields.Char(related='order_id.partner_id.name', string='Partner Name', store=True)

让发票行同步这个内部参考字段

发票行(account.invoice.line)必须先有对应的字段,才能把销售订单行的值同步过来,这里有两种简单的实现方式:

方式一:直接关联产品的内部参考(最省心)

直接用related字段关联产品的default_code,这样发票行的内部参考会和产品保持一致,不需要额外写同步逻辑:

from odoo import models, fields

class AccountInvoiceLine(models.Model):
    _inherit = 'account.invoice.line'

    internal_ref = fields.Char(related='product_id.default_code', string='Internal reference product', store=True)

方式二:从销售订单行同步值(适合自定义逻辑)

如果需要从销售订单行直接取值(比如后续要加自定义逻辑),可以重写发票行的创建方法:

from odoo import models, fields, api

class AccountInvoiceLine(models.Model):
    _inherit = 'account.invoice.line'

    internal_ref = fields.Char(string='Internal reference product', store=True)

    @api.model
    def create(self, vals):
        # 当发票行从销售订单行生成时,同步内部参考字段
        if 'sale_line_ids' in vals and vals['sale_line_ids']:
            # 取关联的第一个销售订单行
            sale_line = self.env['sale.order.line'].browse(vals['sale_line_ids'][0][2][0])
            vals['internal_ref'] = sale_line.internal_ref
        return super(AccountInvoiceLine, self).create(vals)

修改发票报表模板,让字段显示出来

字段同步到发票行后,还得修改QWeb报表模板,把这个字段加到发票里:

  1. 找到Odoo默认的发票报表模板(account.report_invoice_document),继承它并添加字段。
  2. 示例的XML代码如下(你需要根据实际报表结构调整xpath位置):
<odoo>
    <data>
        <template id="report_invoice_add_internal_ref" inherit_id="account.report_invoice_document">
            <!-- 在订单行的第二列后面添加内部参考列 -->
            <xpath expr="//tbody/tr[hasclass('invoice_tbody_row')]/td[2]" position="after">
                <td>
                    <span t-field="line.internal_ref"/>
                </td>
            </xpath>
            <!-- 给表头也加上对应的列标题 -->
            <xpath expr="//thead/tr/th[2]" position="after">
                <th>Internal Reference</th>
            </xpath>
        </template>
    </data>
</odoo>

最后验证调试

做完上面的步骤后,记得升级你的模块,然后按下面的流程验证:

  • 创建带产品的销售订单,确认internal_ref字段显示正常;
  • 从该订单生成发票,检查发票行的internal_ref是否有值;
  • 预览或打印发票,确认字段已经出现在报表里。

如果之前你的发票行代码没生效,大概率是这几个原因:

  • 没有正确继承account.invoice.line模型,检查_inherit是否写对;
  • 没升级模块,代码根本没被加载;
  • 同步逻辑有问题,比如用了方式二但create方法的判断条件不对。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:06:05