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

如何在模板中从字典列表获取name字段的唯一值?

解决方法

方案一:视图层提前处理(推荐)

把数据处理逻辑放在视图层,模板只负责渲染,这是更符合架构设计的高效方案:

# 视图函数示例
from django.shortcuts import render

def your_view(request):
    # 假设原始数据为data_list
    data_list = [
        {'id': 16, 'name': 'something', 'client': 'client1'},
        {'id': 17, 'name': 'something', 'client': 'client2'},
        {'id': 18, 'name': 'something-else', 'client': 'client3'},
    ]
    # 提取唯一name值,用dict.fromkeys保证顺序(Python 3.7+)
    unique_names = list(dict.fromkeys(item['name'] for item in data_list))
    # 如果数据是QuerySet,直接用.values_list('name', flat=True).distinct()即可
    return render(request, 'your_template.html', {'unique_names': unique_names})

模板中直接遍历处理好的列表:

{% for name in unique_names %}
    {{ name }}
{% endfor %}

方案二:模板内使用自定义过滤器

如果必须在模板中处理,可以自定义过滤器提取指定字段的唯一值:

  1. 在你的app下创建templatetags目录,新建custom_filters.py文件:
from django import template

register = template.Library()

@register.filter
def unique_by_field(lst, field_name):
    seen = set()
    for item in lst:
        value = item.get(field_name)
        if value not in seen:
            seen.add(value)
            yield value
  1. 在模板中加载并使用:
{% load custom_filters %}

{% for name in data | unique_by_field:"name" %}
    {{ name }}
{% endfor %}

原写法失效原因

  • {% for name in data | unique %}:默认unique过滤器是对整个字典对象去重,前两个字典的id和client不同,会被判定为不同对象,无法实现按name去重。
  • {% for name in data.name | unique %}:data是列表而非单个字典,列表没有name属性,直接调用会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:02:41