14

嗨,我有一个要传递给 Django 模板的两个字典的列表:

base_parts = [
    {'important item': 43},
    {'lesser item': 22, 'lesser item': 3, 'lesser item': 45}
]

在我的模板中,我可以这样做:

{% for base_part in base_parts %}
    {% for k, v in base_part.items %}

    {# ...do stuff #}

    {# I try to get a running total of items to use as an ID #}
    inner ID: {% forloop.counter0 %}< br/>
    outer ID: {% forloop.parentloop.counter0 %}< br/>

    {% endfor %}
{% endfor %}

正如你所看到的,我想要的是我迭代过的项目总数的运行总数,但是我包含的两种方法都返回重复项。我知道我可以连接循环,但我使用的是表单集,并且真的希望 id 被索引为 0,1,2...等。

有没有办法在模板中实现这种类型的计数?

非常感谢任何帮助。

编辑

目前的输出如下所示:

outerID: 0<br />
innerID: 0<br />
outerID: 0<br />
innerID: 1<br />
outerID: 1<br />
innerID: 0<br />
outerID: 1<br />
innerID: 1<br />
outerID: 1<br />
innerID: 2<br />

我想:

totalID: 0<br />
totalID: 1<br />
totalID: 2<br />
totalID: 3<br />
totalID: 4<br />
totalID: 5<br />
totalID: 6<br />
totalID: 7<br />
totalID: 8<br />
totalID: 9<br />
4

5 回答 5

13

我找到了一个更好的解决方案itertools。(比我之前的回答好)您可以将循环的当前状态设置为发送到视图上下文的 itertools 变量。这次我尝试了一个虚拟的 Django 项目,它就像一个魅力。

视图.py:

from django.shortcuts import render_to_response
import itertools

def home(request):
    iterator=itertools.count()
    base_parts = [
        {'important item': 43},
        {'lesser item1': 22, 'lesser item2': 3, 'lesser item3': 45},
        {'most important item': 55}
    ]
    return render_to_response('index.html', 
                             {'base_parts': base_parts, 'iterator':iterator})

索引.html:

{% for base_part in base_parts %}
    {% for k, v in base_part.items %}
        {{ iterator.next }} - {{ v }}<br/>
    {% endfor %}
{% endfor %}

HTML 输出:

0 - 43
1 - 22
2 - 45
3 - 3
4 - 55

排序值:

(这部分不是对实际问题的回答。这更像是我在玩弄)

您可以使用 Django 的SortedDict而不是 Python 的内置字典来保持项目的顺序。

视图.py

from django.shortcuts import render_to_response
import itertools
from django.utils.datastructures import SortedDict

def home(request):
    iterator=itertools.count()
    base_parts = [
        SortedDict([('important item', 43)]),
        SortedDict([('lesser item1', 22), 
                    ('lesser item2', 3), 
                    ('lesser item3', 45)]),
        SortedDict([('most important item', 55)])
    ]
    print base_parts[1]
    return render_to_response('index.html', 
                             {'base_parts': base_parts, 'iterator':iterator})

HTML 输出:

0 - 43
1 - 22
2 - 3
3 - 45
4 - 55

编辑 2014 年 5 月 25 日

你也可以使用collections.OrderedDict代替 Django 的 SortedDict。

编辑 2016 年 6 月 28 日

调用iterator.next在 Python 3 中不起作用。您可以创建自己的迭代器类,从 itertools.count 继承:

import itertools
class TemplateIterator(itertools.count):
    def next(self):
        return next(self)
于 2012-12-14T02:02:04.417 回答
4

在理想情况下,您应该避免将这种逻辑放在模板中。如果您没有在输出中保留层次结构(例如,将这些项目显示为列表列表),请展平列表并使用简单的 for 循环和循环计数器。

然而,理想的解决方案并不总是一种选择。从理论上讲,我相信以下可以/应该工作

{% for base_part in base_parts %}     
    {% with outerCount = forloop.parentloop.counter0 %}
    {% for k, v in base_part.items %}
        ...
        {% with innerCounter = forloop.counter %}
        {{ outerCounter|add:innerCounter }}
    {% endfor %}
{% endfor %}
于 2012-12-14T01:38:57.777 回答
1

更新:这不是一个正确的答案。我只是把它放在这里以显示什么不起作用

我不得不承认我没有尝试过这个,但你可以使用withadd语句。

{% with total=0 %}
    {% for base_part in base_parts %}
        {% for k, v in base_part.items %}

        {# ...do stuff #}

        {# I try to get a running total of items to use as an ID #}
        totalId: {{ total|add:"1" }} <br/>
        {% endfor %}
    {% endfor %}
{% endwith %}

这可能适用于模板级别,但我认为更好的方法是在视图级别计算它并将字典传递给包含计算值的模板。

于 2012-12-14T01:01:26.637 回答
0

在视图代码中这样做会非常有效......

    #Calculate the count
    count = 0
    for item in base_parts:
       count+=len(item.keys())

    run_range = range(count)

    return to the template

    #template
    {% for x in run_range|slice:'1' %}
    {{x}}
    {% endfor %}
于 2012-12-14T01:36:29.300 回答
0

所以我实际上只是将字典项附加到一个列表中,确保我想要的是第一个:

base_parts = []
for k, v in rails_dic.items():
    base_parts.append({k: v})
for k, v in accessories_dic.items():
    base_parts.append({k: v})

这可能不是最好的方法,我愿意以更蟒蛇的方式作为正确答案

我认为在模板中处理这个问题既棘手又不合适。这就是我不接受这些答案的原因。我希望未来的访问者可以看到以更正确的方式寻求整体问题的解决方案,而不仅仅是如何在模板中破解它。

于 2012-12-14T20:20:17.093 回答