如何在模板中从字典列表获取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 %}
方案二:模板内使用自定义过滤器
如果必须在模板中处理,可以自定义过滤器提取指定字段的唯一值:
- 在你的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
- 在模板中加载并使用:
{% 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
相关产品推荐
相关产品推荐

