【问题标题】:Using index from iterated list使用迭代列表中的索引
【发布时间】:2014-10-04 10:35:31
【问题描述】:

我正在尝试根据当前在另一个列表上迭代的索引显示来自不同列表的值,但无法弄清楚如何访问各个项目..

{% for row in myarray.all %}
    <tr>
    <th>{{ my_other_array_where_I_cant_access_elements.forloop.counter }}</th>
    <td>{{ row }}</td>
    </tr>
{% endfor %}

如您所见,我尝试使用forloop.counter,但这并没有显示任何内容,它只是创建了一个空的表头元素。

我的另一个数组在视图中定义如下,如果我删除forloop.counter,那么我可以看到整个数组打印到表头

 my_other_array_where_I_cant_access_elements = ["X", "Y", "Z", "XX", "YY"]

如果我遗漏了任何必需的详细信息,请告诉我。

【问题讨论】:

  • 不应该是forloop.counter0(要有一个从0开始的索引)吗?
  • @manuBriot - 如果是这种情况,我希望至少显示一些值(作为记录,我也尝试过,但它仍然没有显示任何值)

标签: python django list django-templates


【解决方案1】:

听起来您想同时迭代两个列表,换句话说,zip() 列表。

如果是这种情况,最好在视图中执行此操作并在上下文中传递:

headers = ["X", "Y", "Z", "XX", "YY"]
data = zip(headers, myarray.all())
return render(request, 'template.html', {'data': data})

然后,在模板中:

{% for header, row in data %}
    <tr>
        <th>{{ header }}</th>
        <td>{{ row }}</td>
    </tr>
{% endfor %}

【讨论】:

  • 我刚刚研究了实现这一点,但这是不可能的,因为myarray 实际上是另一个对象中根深蒂固的数组,我想避免存储这些标头在数据库中(存储对象的地方)..在模板方面是否有这样的解决方案,还是我只需要硬着头皮在数据库中保存标题?
  • @Sayse 自定义模板过滤器在这种情况下可能是一个选项:stackoverflow.com/a/14857664/771848
  • 谢谢,我会看看实现它,看起来正是我需要的
【解决方案2】:

有一种可能的方法,我刚刚尝试过。但是,它仅在您仅将第二个数组用作单个 for 循环的一部分且不使用循环索引时才有效:

arr = ["1-0", "1-1"]     # your first array
arr2 = ["2-0", "2-1"]    # your second array

class wrap(object):
    def __init__(self, ref):
        self.ref = ref
        self.idx = -1
    def next(self):
        self.idx += 1
        return self.ref[self.idx]

return render_to_response('...', { "arr": arr, "wrap": wrap(arr2) })

模板是:

{% for row in arr %}
<h1>Row {{ row }} at {{ forloop.counter }} matches {{ wrap.matching }} </h1>
{% endfor %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2018-09-21
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2011-09-03
    相关资源
    最近更新 更多