循环中的 Django 计数器以索引列表
Posted
技术标签:
【中文标题】循环中的 Django 计数器以索引列表【英文标题】:Django counter in loop to index list 【发布时间】:2011-06-11 12:30:25 【问题描述】:我将两个列表传递给一个模板。通常,如果我要遍历一个列表,我会做这样的事情
% for i in list %
但我有两个需要并行访问的列表,即。一个列表中的第 n 项对应于另一个列表中的第 n 项。我的想法是遍历一个列表并使用 forloop.counter0 访问另一个列表中的项目,但我无法弄清楚使其工作的语法。
谢谢
【问题讨论】:
【参考方案1】:不要以为你能那样做。在将对齐的数据结构传递给模板之前,您需要一个模板标签,或者更好的标签来对齐视图逻辑中的列表。
【讨论】:
【参考方案2】:你不能。简单的方法是在zipped list 中预处理您的数据,像这样
在你看来
x = [1, 2, 3]
y = [4, 5, 6]
zipped = zip(x, y)
然后在你的模板中:
% for x, y in zipped %
x - y
% endfor %
【讨论】:
您认为这比使用 multifor 更好吗?我当然喜欢这样会产生一个更简单的模板 @Xavier 我试过用表单集传递列表(对于额外的非输入上下文)它呈现完美但表单集不提交!如何解决?【参考方案3】:听起来您正在寻找我的django-multiforloop。来自自述文件:
渲染此模板
% load multifor %
% for x in x_list; y in y_list %
x : y
% endfor %
在这种情况下
context =
"x_list": ('one', 1, 'carrot'),
"y_list": ('two', 2, 'orange')
会输出
one:two
1:2
carrot:orange
【讨论】:
【参考方案4】:我最终不得不这样做:
% for x in x_list %
% for y in y_list %
% if forloop.counter == forloop.parentloop.counter %
Do Something
% endif %
% endfor %
% endfor %
【讨论】:
我认为这是一个O(n^2)
解决方案,您可以简单地使用 O(n)
。【参考方案5】:
为了使用 forloop 计数器访问可迭代对象,我编写了以下非常简单的过滤器:
from django import template
register = template.Library()
@register.filter
def index(sequence, position):
return sequence[position]
然后我可以在我的模板中使用它(不要忘记加载它):
% for item in iterable1 %
iterable2|index:forloop.counter0
% endfor %
希望这对其他人有帮助!
【讨论】:
这虽然采取了一些额外的步骤来实现,但允许forloop.counter0
应该在 for 循环中提供变量的用法。我将返回语句更改为:return sequence[position]
以满足我的需要。
@Flash 我实际上也在我的真实代码中使用sequence[position]
,在这里更新!以上是关于循环中的 Django 计数器以索引列表的主要内容,如果未能解决你的问题,请参考以下文章