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

Jinja模板中无法基于variant_id输出唯一项问题求助

解决Jinja模板中基于variant_id去重展示商品的问题

你的代码之所以会输出所有重复项,核心原因是Jinja模板中的变量默认是不可变的:在for循环里重新赋值unique_items时,只是创建了一个循环内的局部变量,外层的unique_items列表根本没被修改,导致每次循环判断item.variant_id not in unique_items都为真,自然会输出所有条目。

下面给两种可行的解决方案:

方案一:使用namespace保存可变集合

Jinja的namespace对象允许修改其属性值,我们可以用它来记录已经处理过的variant_id:

{% set ns = namespace(unique_variant_ids=[]) %}
{% for item in items %}
    {% if item.variant_id not in ns.unique_variant_ids %}
        {% set _ = ns.unique_variant_ids.append(item.variant_id) %}
        {% set quantity = items | selectattr("variant_id", "equalto", item.variant_id) | list | length %}
        <tr>
            <td style="width: 0; padding: 0px !important">
                <img
                    src="{{ item.image_url }}"
                    style="height: 118px; width: 78px; border-radius: 4px"
                />
            </td>
            <!-- 补充你的其他表格内容 -->
        </tr>
    {% endif %}
{% endfor %}
  • 用ns.unique_variant_ids来记录已处理的ID,append方法会直接修改这个列表
  • {% set _ = ... %}是因为append没有返回值,用占位符变量_接收可以避免Jinja报错

方案二:用groupby过滤器分组(更高效)

直接用Jinja的groupby过滤器按variant_id对items分组,一次完成去重和数量统计,性能更优:

{% for variant_id, group in items | groupby('variant_id') %}
    {% set item = group[0] %}  <!-- 取分组内第一个商品作为展示项 -->
    {% set quantity = group | length %}
    <tr>
        <td style="width: 0; padding: 0px !important">
            <img
                src="{{ item.image_url }}"
                style="height: 118px; width: 78px; border-radius: 4px"
            />
        </td>
        <!-- 其他内容,比如数量可以直接用{{ quantity }} -->
    </tr>
{% endfor %}
  • 分组后每个group就是同一variant_id的所有商品集合,group|length直接得到数量
  • 无需额外维护去重列表,代码更简洁,避免了循环内重复遍历整个items列表的性能损耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:03:20