循环中的 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 计数器以索引列表的主要内容,如果未能解决你的问题,请参考以下文章

django 模版语法,for循环使用计数器索引

Django模板中的条件计数器循环

遍历列表,更好的方法

python中的enumerate()函数的用法

我可以在没有计数器的情况下引用“for each”循环的索引吗?

python循环