Django循环计数器用于索引列表

16

我将两个列表传递给模板。通常情况下,如果我要遍历一个列表,我会这样做:

{% for i in list %}

但是我有两个列表需要同时访问,即一个列表中的第n项对应于另一个列表中的第n项。我的想法是循环遍历其中一个列表,并使用forloop.counter0访问另一个列表中的项目,但我无法弄清楚如何编写语法以使其工作。

谢谢

6个回答

28

你做不到。简单的方法是在一个压缩列表中预处理你的数据,就像这样:

在你的视图中

x = [1, 2, 3]
y = [4, 5, 6]
zipped = zip(x, y)

然后在您的模板中:

{% for x, y in zipped %}
    {{ x }} - {{ y }}
{% endfor %}

你认为这是比使用多个for循环更好的解决方案吗?我确实喜欢它能够得到一个更简单的模板。 - JPC
@Xavier 我已经尝试过使用formset传递列表(用于额外的非输入上下文),它可以完美地呈现,但是formset无法提交!如何解决这个问题? - Poula Adel

21

为了使用for循环计数器访问可迭代对象,我编写了下面这个非常简单的过滤器:

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 %}

希望这能帮助到其他人!


虽然需要额外的几个步骤来实现,但这样可以在for循环中使用forloop.counter0提供的变量。我将返回语句更改为:return sequence[position]以满足我的需求。 - Flash
1
@Flash 我实际上在我的真实代码中也使用了 sequence[position],这里已经更新了! - Caumons

8
听起来你在寻找我的django-multiforloop。从README中可以看到:
渲染此模板
{% 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

7
我最终不得不这样做:
{% 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)来解决。 - Mahadeva

0
不要以为你可以那样做。你需要使用模板标签,或者更好的方法是,在将对齐的数据结构传递给模板之前,在视图逻辑中对列表进行对齐。

-1

我通过向其中一个模型添加占位符属性(例如template_property1)来解决了这个问题。

然后,在views.py函数中添加逻辑,循环遍历两个模型并分配值:

model1 = Model1.objects.all()
model2 = Model2.objects.all()

for m1 in model1:                          (loop through model1) 
  for m2 in model2:                        (loop through model2)
    if m2.FK == m1:                        (MATCH SOME CRITERIA)   
      m1.template_property1 = m2.property  (ASSIGN VALUE)

然后通过单个模型对象在模板中访问所有值 对于model1中的m1, {{ model1.template_property1 }}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接