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
相关产品推荐
相关产品推荐

