我将两个列表传递给模板。通常情况下,如果我要遍历一个列表,我会这样做:
{% for i in list %}
但是我有两个列表需要同时访问,即一个列表中的第n项对应于另一个列表中的第n项。我的想法是循环遍历其中一个列表,并使用forloop.counter0访问另一个列表中的项目,但我无法弄清楚如何编写语法以使其工作。
谢谢
你做不到。简单的方法是在一个压缩列表中预处理你的数据,就像这样:
在你的视图中
x = [1, 2, 3]
y = [4, 5, 6]
zipped = zip(x, y)
然后在您的模板中:
{% for x, y in zipped %}
{{ x }} - {{ y }}
{% endfor %}
为了使用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 %}
希望这能帮助到其他人!
forloop.counter0
提供的变量。我将返回语句更改为:return sequence[position]
以满足我的需求。 - Flashsequence[position]
,这里已经更新了! - Caumons{% 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
{% 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我通过向其中一个模型添加占位符属性(例如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 }}