Dar*_*ech 12 django django-templates
嗨,我有一个两个字典的列表,我将传递给Django模板:
base_parts = [
{'important item': 43},
{'lesser item': 22, 'lesser item': 3, 'lesser item': 45}
]
Run Code Online (Sandbox Code Playgroud)
在我的模板中,我可以这样做:
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我想要的是我迭代完成的项目总数的运行总计,但我包含的两种方法都包含返回重复项.我知道我可以连接循环,但我使用的是一个formset,并且真的希望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 />
Run Code Online (Sandbox Code Playgroud)
我想要:
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 />
Run Code Online (Sandbox Code Playgroud)
use*_*ame 13
我发现了一个更好的解决方案itertools.(优于我之前的答案)您可以将循环的当前状态设置为发送到视图上下文的itertools变量.这次我尝试了一个虚拟的Django项目,它就像一个魅力.
views.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})
Run Code Online (Sandbox Code Playgroud)
index.html的:
{% for base_part in base_parts %}
{% for k, v in base_part.items %}
{{ iterator.next }} - {{ v }}<br/>
{% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
HTML输出:
0 - 43
1 - 22
2 - 45
3 - 3
4 - 55
Run Code Online (Sandbox Code Playgroud)
排序值:
(这部分不是实际问题的答案.它更像是我在玩耍)
您可以使用Django的SortedDict而不是Python的内置字典来保持项目的顺序.
views.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})
Run Code Online (Sandbox Code Playgroud)
HTML输出:
0 - 43
1 - 22
2 - 3
3 - 45
4 - 55
Run Code Online (Sandbox Code Playgroud)
编辑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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12943 次 |
| 最近记录: |