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

如何在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>

方案二:模板内实现(需自定义标签)

如果不想修改视图,可以通过自定义模板标签维护全局计数器:

  1. 在你的Django app下创建templatetags/custom_tags.py文件,添加以下代码:
from django import template

register = template.Library()

@register.simple_tag
def increment_counter(current):
    return current + 1
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:44:55