ForLoop迭代作为Django模板中的列表索引

时间:2012-01-19 19:54:56

标签: python django loops

我正在构建一个django网页,但我似乎遇到了麻烦,因为我无法弄清楚如何使用for循环(在模板中)的当前迭代来获取多个列表:

        {% for num in loopRange %}
    <tr>
        {% for num2 in subRange %}
        <td>{% cycle list1 list2 list3 list4 %}</td>
        {% endfor %}
    </tr>
    {% endfor %}

我发现这里有几个问题stackoverflow是类似的,我试图使用循环,但唉这只是导致列表的所有成员每次打印 - 不完全出乎意料但我无法弄清楚如何我的生活。

我所拥有的是多个内容相似的列表,每个列表都是一行中的列。所以,如果它是python并且我连接字符串,它将是这样的:

for i in xrange(5):
    string = list1[i] + list2[i] + list3[i] + list 4[i]

基本上就是这样。除了两个xranges(第一个例子中的loopRange和Subrange)之外,我将每个列表作为上下文传递,我需要五行(每个列表有五个成员)和四列(四个列表)。

编辑:我想在一个例子中我想将列表indeces称为foo [bar],在django中作为foo.bar完成,但是bar显然不能是一个整数,作为内容传入的可迭代范围

谢谢!

3 个答案:

答案 0 :(得分:3)

我想说最好的方法是在将视图中的数据传递给模板之前对其进行处理。

例如,zip内置可用于根据包含列的列表创建行列表:

rows = zip(list1, list2, list3, list4)

之后,模板可以逐个遍历行,并在需要时使用索引访问来访问列:

{% for row in rows %}
  {{row.0}} {{row.1}} {{row.2}} {{row.3}}
{% endfor %}

答案 1 :(得分:1)

您只需创建一个简单的过滤器即可从列表中返回项目:

@register.filter
def get_item(row, i):
    try:
        return row[i]
    except IndexError:
        return ''

然后:

{{ list1|get_item:num2 }}

答案 2 :(得分:0)

如果你真的想出于某种原因在你的模板中做这件事,你也可以写一个custom template tag为你做这件事:

#app/templatetags/zip.py
from django import template

register = template.Library()

class Zipper(template.Node):
    def __init__(self, format_string, var_name):
        self.format_string = format_string
        self.var_name = var_name
    def render(self, context):
        zippables = [context[tok] for tok in self.format_string.split()]
        import pdb; pdb.set_trace()
        context[self.var_name] = zip(*zippables)
        return ''

import re

@register.tag(name="zip")
def do_zip(parser, token):
    try:
        # Splitting by None == splitting by spaces.
        tag_name, arg = token.contents.split(None, 1)
    except ValueError:
        raise template.TemplateSyntaxError("%r tag requires arguments" % token.contents.split()[0])
    m = re.search(r'(.*?) as (\w+)', arg)
    if not m:
        raise template.TemplateSyntaxError("%r tag had invalid arguments" % tag_name)
    format_string, var_name = m.groups()
    return Zipper(format_string, var_name)

注意:由于添加了assignment_tag,这种语法在Django 1.4中会变得更加简单。

然后,就这样使用它:

{%load zip%}

{% zip list1 list2 list3 list4 as list_of_rows %}

然后,您可以在该块中的任何位置使用list_of_rows,包括两个嵌套for循环内部。