在Django模板

时间:2015-11-12 14:44:35

标签: django django-templates

我正在尝试在django模板中迭代列表。在python中,它看起来像下面,它的工作原理:

l=[lots ot touples]
for li in range(len(l)):
    print(l[li])

但是在django模板中它不起作用。我的问题是:在django模板中迭代列表的最简单等价是什么?

我的django模板:

<html>
<body>
{% for w in l %}
  <li>{{ w }}</li>
{% endfor %}
</body>
</html>

提前谢谢

P.S。我已经添加了touples列表以准确显示问题所在 另一个PS

www网站的输出(我在gmail中显示未读电子邮件)如下所示:

('From1', 'subject1', 'Thu, 12 Nov 2015 09:46:34 +0100')
('From2', 'subject2', 'Thu, 12 Nov 2015 13:48:58 +0100')
('From3', 'subject3', 'Thu, 12 Nov 2015 14:12:34 +0100')

我希望列表中的每个项目分配给touple。 我要做的是分配touple,例如:

touple1 =('From1','subject1','星期四,2015年11月12日09:46:34 +0100')

所以我以后可以打电话给'from','subject'或'date'

问候

也许我会以另一种方式展示它以使其更清晰: for循环遍历电子邮件消息(touples列表)

email1 = list[1]     //touple
email2 = list[2]     //touple

(...)

from1 = email1[0]
subject1 = email1[1]
date1 = email1[3]

等等。

解决。谢谢大家的帮助。每个解决方案对我都有帮助。我想将两个答案(如果可能的话)标记为对我来说非常有用,以显示解决同一问题的不同方法。我想提一下,每一个帮助对我来说都非常有用。 你介意我是否会将正确的答案标记为Alasdair和Noah的回答(不知道我能记下多少)?

4 个答案:

答案 0 :(得分:3)

你可以做一个非常类似的事情:https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#for-empty

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>

检查您的列表是否符合您的预期,可能在上下文中缺失,或者是否在其他地方引发了其他错误。

也许这是一本字典?在这种情况下,你需要这样的东西:

{% for key, value in data.items %}
    {{ key }}: {{ value }}
{% endfor %}

如果它是元组,您可以将值解压缩为多个变量

{% for item1, item2 in items_list %}

答案 1 :(得分:3)

给出以下元组列表:

emails = [
    ('From1', 'subject1', 'Thu, 12 Nov 2015 09:46:34 +0100')
    ('From2', 'subject2', 'Thu, 12 Nov 2015 13:48:58 +0100')
    ('From3', 'subject3', 'Thu, 12 Nov 2015 14:12:34 +0100')
]

您可以遍历元组,并使用.0.2按索引访问元素:

{% for email in emails %}
{{ email.0 }} - {{ email.1 }} - {{ email.2 }}
{% endfor %}

或者,您可以解压缩元组变量:

{% for from, subject, date in emails %}
{{ from }} - {{ subject }} - {{ date }}
{% endfor %}

顺便说一下,你的Python代码并不是非常pythonic。

代替循环范围
emails = [...]
for li in range(len(emails)):
print(emails[li])

你可以直接在列表上循环

for email in emails:
    print(emails)

您可以像在Django模板中一样进行解包。

for from, sender, date in emails:
    print(from, sender, date)

答案 2 :(得分:1)

没有必要像range一样使用len来执行此操作,就像使用C或JavaScript一样,只需迭代它:

l=[some array elements]
for item in l:
    print(item)

在你的模板中:

<html>
<body>
{% for item in l %}
  <li>{{ item }}</li>
{% endfor %}
</body>
</html>

如果l是查询集:

<html>
<body>
{% for item in l %}
  <li>{{ item.field1 }}</li>
  <li>{{ item.field2 }}</li>
{% endfor %}
</body>
</html>

修改

l=[lots ot touples]

如果元组只有两个项目,请坚持@ danielfranca的答案:

{% for item1, item2 in items_list %}
    ....
{% endfor %}

如果元组的长度是可变的,那么你将不得不再次迭代:

{% for tup in items_list %}
    {% for item in tup %}
        <li>{{ item }}</li>
    {% endfor %}
{% endfor %}

答案 3 :(得分:1)

您的解决方案看起来不错。您已按照文档中所示正确构建了它:https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#for

但是,您引用的列表可能不在模板的上下文中,因此模板无法看到它。确保将列表添加到上下文中:https://docs.djangoproject.com/en/1.8/ref/templates/api/#rendering-a-context

鉴于您的列表包含元组,您需要访问元组的每个元素。如果你的元组是相同的并且每个包含三个项目,你可以解压缩它们:

<html>
<body>
{% for from, subject, date in l %}
  <li>{{ from }}, {{ subject }}, {{ date }}</li>
{% endfor %}
</body>
</html>

如果元组的长度不同,您可能希望在将列表发送到模板之前对列表进行一些预处理。您可以创建一个对象并将元组转换为具有命名字段的对象。

class Email(object):
    def __init__(self, email_tup):
        self.from = email_tup[0]
        self.subject = email_tup[1]
        self.date = email_tup[2]
        # do more complex logic here for varying sized tuples
        if len(email_tup) > 3:
            self.body = email_tup[3]

email_list = [Email(w) for w in l]

然后将新列表传递给模板上下文。

<html>
<body>
{% for email in email_list %}
  <li>{{ email.from }}, {{ email.subject }}, {{ email.date }}</li>
{% endfor %}
</body>
</html>