如何在Django模板中获取分组内对象的全局计数器?
在Django中为regroup分组的对象添加全局序号
问题背景
我用Django的regroup模板标签对城市列表按国家分组,现有数据:
cities = [ {"name": "Mumbai", "population": "19,000,000", "country": "India"}, {"name": "Calcutta", "population": "15,000,000", "country": "India"}, {"name": "New York", "population": "20,000,000", "country": "USA"}, {"name": "Chicago", "population": "7,000,000", "country": "USA"}, {"name": "Tokyo", "population": "33,000,000", "country": "Japan"}, ]
当前模板分组代码:
{% regroup cities by country as country_list %} <ul> {% for country in country_list %} <li>{{ country.grouper }} <ul> {% for city in country.list %} <li>{{ city.name }}: {{ city.population }}</li> {% endfor %} </ul> </li> {% endfor %} </ul>
当前输出:
India Mumbai: 19,000,000 Calcutta: 15,000,000 USA New York: 20,000,000 Chicago: 7,000,000 Japan Tokyo: 33,000,000
需要给每个城市添加全局递增序号,实现如下效果:
India 1: Mumbai: 19,000,000 2: Calcutta: 15,000,000 USA 3: New York: 20,000,000 4: Chicago: 7,000,000 Japan 5: Tokyo: 33,000,000
实际场景是分组的问题列表需要全局计数器,询问是否能在模板内实现,还是必须在视图层处理。
两种解决方案
方案一:视图层处理(推荐)
直接在视图中给每个对象添加全局序号字段,逻辑简单且易维护:
def your_view(request): cities = [ {"name": "Mumbai", "population": "19,000,000", "country": "India"}, {"name": "Calcutta", "population": "15,000,000", "country": "India"}, {"name": "New York", "population": "20,000,000", "country": "USA"}, {"name": "Chicago", "population": "7,000,000", "country": "USA"}, {"name": "Tokyo", "population": "33,000,000", "country": "Japan"}, ] # 给每个城市添加全局序号,从1开始 for idx, city in enumerate(cities, start=1): city["global_index"] = idx return render(request, "your_template.html", {"cities": cities})
模板中直接调用新增的字段:
{% regroup cities by country as country_list %} <ul> {% for country in country_list %} <li>{{ country.grouper }} <ul> {% for city in country.list %} <li>{{ city.global_index }}: {{ city.name }}: {{ city.population }}</li> {% endfor %} </ul> </li> {% endfor %} </ul>
方案二:模板内实现(需自定义标签)
如果不想修改视图,可以通过自定义模板标签维护全局计数器:
- 在你的Django app下创建
templatetags/custom_tags.py文件,添加以下代码:
from django import template register = template.Library() @register.simple_tag def increment_counter(current): return current + 1
- 在模板中加载自定义标签并使用:
{% load custom_tags %} {% regroup cities by country as country_list %} {% with counter=0 %} <ul> {% for country in country_list %} <li>{{ country.grouper }} <ul> {% for city in country.list %} {% increment_counter counter as counter %} <li>{{ counter }}: {{ city.name }}: {{ city.population }}</li> {% endfor %} </ul> </li> {% endfor %} </ul> {% endwith %}
内容的提问来源于stack exchange,提问作者Mathieu Dhondt
相关产品推荐
相关产品推荐

