自定义采购报表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
相关产品推荐
相关产品推荐

