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

Odoo销售订单报表打印产品变体报错求助:QWebException问题解决

解决QWeb报表中产品变体属性拼接的报错问题

咱们先来拆解下你遇到的报错:sequence item 0: expected string, product.attribute found,说白了就是你用', '.join()拼接的元素不是字符串,而是产品属性对象,Python肯定不认啊!

问题根源

你原来写的代码里,x.attribute_id取的是product.attribute类型的对象,而join方法只能处理字符串。另外还有个小问题:在t-foreach="doc.order_line" t-as="l"的循环里,你应该用当前循环行的l.product_id,而不是全局的doc.order_line.product_id,不然会重复取所有订单行的产品属性,逻辑完全不对。

修复方案

我们需要把属性对象转换成它的名称字符串,也就是取x.attribute_id.name,同时修正循环内的产品引用为l.product_id。如果要完整显示产品变体的“属性名+属性值”(比如“颜色: 红色, 尺寸: M”),还可以直接遍历产品的attribute_value_ids,这样更贴合“产品变体作为描述”的需求。

修复后的QWeb代码片段

<t t-foreach="doc.order_line" t-as="l">
  <tr t-if="l.product_uom_qty">
    <td>
      <span t-field="l.product_id.name"/>
    </td>
    <!-- 显示产品变体的属性名+属性值(推荐方案) -->
    <td>
      <span t-esc="', '.join([f'{val.attribute_id.name}: {val.name}' for val in l.product_id.attribute_value_ids])"/>
    </td>
    <td>
      <span t-field="l.product_id.default_code"/>
    </td>
    <!-- 如果只需要属性名称,用下面这行 -->
    <td>
      <span t-esc="', '.join([line.attribute_id.name for line in l.product_id.product_tmpl_id.attribute_line_ids])"/>
    </td>
    <td class="text-right">
      <span t-field="l.product_uom_qty"/>
      <span groups="product.group_uom" t-field="l.product_uom"/>
    </td>
    <td class="text-right">
      <span t-field="l.price_unit"/>
    </td>
    <td class="text-right">
      <span t-esc="', '.join(map(lambda x: (x.description or x.name), l.tax_id))"/>
    </td>
  </tr>
</t>

额外说明

  • 如果你只需要显示属性的名称(比如“颜色, 尺寸”),就用attribute_line_ids的attribute_id.name;
  • 如果要显示完整的变体信息(属性名+对应的值),用attribute_value_ids的组合字段会更实用,用户一眼就能看懂产品的具体变体;
  • 循环内一定要用l.product_id,不然会把所有订单行的产品属性都混在一起,逻辑完全错误。

内容的提问来源于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 09:05:04