我正在尝试在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的回答(不知道我能记下多少)?
答案 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>