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

自定义采购报表XML调用product_code字段遇QWebException报错求助

解决Odoo采购报表中供应商产品参考字段的QWebException错误

你遇到的问题根源很明确:product.product模型本身并不包含product_code字段——这个字段是存放在product.supplierinfo模型里的,每个产品可以对应多个供应商的不同编码,所以直接通过order_line.product_id.product_code访问肯定会报错。

下面给你两种可行的解决方案,按需选择:

方案一:直接在QWeb模板中筛选对应供应商的产品编码

不需要修改Python代码,直接在报表模板里通过筛选product.supplier_ids找到当前订单供应商对应的记录:

<td>
  <!-- 筛选当前订单供应商对应的产品供应商信息 -->
  <t t-set="supplier_info" t-value="order_line.product_id.supplier_ids.filter(lambda s: s.name == o.partner_id)" />
  <!-- 输出编码,处理无对应信息的情况避免报错 -->
  <span t-esc="supplier_info[0].product_code if supplier_info else ''" />
</td>

这个方法的好处是快速修改模板生效,但如果报表里大量使用这个字段,推荐用下面的方案更优雅。

方案二:给采购订单行新增计算字段(推荐)

通过继承purchase.order.line模型,新增一个计算字段来获取当前供应商的产品编码,这样模板里可以直接调用,代码更清晰也更易维护:

1. 编写Python代码(在自定义模块的models目录下)

from odoo import fields, models

class PurchaseOrderLine(models.Model):
    _inherit = 'purchase.order.line'

    supplier_product_code = fields.Char(
        compute='_compute_supplier_product_code',
        string='Supplier Product Reference',
        store=False
    )

    def _compute_supplier_product_code(self):
        for line in self:
            # 筛选当前订单供应商对应的产品供应商记录
            supplier_info = line.product_id.supplier_ids.filtered(
                lambda s: s.name == line.order_id.partner_id
            )
            # 赋值,无记录时显示空字符串
            line.supplier_product_code = supplier_info[0].product_code if supplier_info else ''

2. 修改QWeb模板

把原来的order_line.product_id.product_code替换成新增的字段:

<td>
  <span t-field="order_line.supplier_product_code"/>
</td>

注意事项

  • 确保产品的供应商信息(product.supplierinfo)已经正确维护,否则会显示空值
  • 如果需要支持多供应商的优先级(比如同一个产品对应同一个供应商有多条记录),可以在筛选时加上排序逻辑,比如按sequence字段排序取第一条

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:42:47