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报表模板,把这个字段加到发票里:
- 找到Odoo默认的发票报表模板(
account.report_invoice_document),继承它并添加字段。 - 示例的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
相关产品推荐
相关产品推荐

