【问题标题】:Traverse more then one list in for loop in django在django的for循环中遍历一个以上的列表
【发布时间】:2013-12-27 06:02:57
【问题描述】:

我有三个列表,我只想对这些列表使用一个 for 循环,因为我正在使用自定义过滤器。我不能使用 zip,因为如果我的列表之一为空,那么 zip 将返回空列表,所以我想我必须为此使用自定义过滤器。

代码:

a = []
b = [{"qq":1},{"ww":2},{"ee":3}]
c = [{"rr":4}]

现在我希望我的自定义过滤器只返回这 3 个列表中的一个。

自定义过滤器:

def zip(a,b):
    return a + b

在我的模板中我使用了这个:

1) 为两个列表工作

{% for x in a|zip:b %}    
{% endfor %}

2) 不适用于三个列表:

{% for x in a|zip:b|zip:c %}
{% endfor %}

3) 如果制作两个过滤器 zip1 和 zip2 并使用它,那么它也不起作用:

{% for x in a|zip1:b|zip2:c %}
{% endfor %}

4)我也尝试发送到一个过滤器中的列表,以便我可以在那里拆分它们并完成我的工作,但这给了我错误只能将列表(不是“SafeText”)连接到列表

{% for x in a|zip1:'b,c' %}      
{% endfor %}

我们将不胜感激。

【问题讨论】:

  • 您是否尝试过使用内置的add 过滤器?它可以处理将两个列表添加在一起 ​​- 但是您的自定义 zip 过滤器使用对我来说看起来相同的行为,我不确定为什么这不起作用。试试{% for x in a|add:b|add:c %} - 有关添加两个列表的示例,请参见docs.djangoproject.com/en/dev/ref/templates/builtins/#add
  • 实际上问题出在我的第三个数组中,即第二个过滤器不起作用,但是我发现当你建议我使用 add 时。谢谢

标签: python django django-templates


【解决方案1】:
a = []
b = [{"qq":1},{"ww":2},{"ee":3}]
c = [{"rr":4}]

m = max(len(a), len(b), len(c))

a = (a + [{}]*m)[:m]
b = (b + [{}]*m)[:m]
c = (c + [{}]*m)[:m]

for x, y, z in zip(a, b, c):
    #do something fancy

或作为上下文变量传递

context = {
    zipped_list: zip(a, b, c),
}

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多