问题在于你正在遍历
iteritems()
,这是一个(key, value)对的迭代器。这意味着
l
变量是一个元组,而不是一个字典。实际上,你需要遍历
itervalues()
。请按照以下方式更新模板代码:
{% for l in result.itervalues() %}
<div class="link">
<a href="{{ l.url }}"> {{l.title}}</a>
<img src="{{ l.img }}" width="100" height="100">
</div>
{% endfor %}
我相信这样可以得到你想要的行为。
请注意,这将随机返回字典中的值(因为迭代字典是随机的)。如果您想按键排序,您可以修改模板如下:
{% for key in result.iterkeys()|sort %}
<div class="link">
{%- set val=result[key] %}
<a href="{{ val.url }}"> {{val.title}}</a>
<img src="{{ val.img }}" width="100" height="100">
</div>
{% endfor %}
在这里,我们按照已排序的键值进行迭代,获取相关联的值,并将其放入模板中。
你也可以用另一个过滤器替换sort
过滤器,应用你选择的排序方式。
下面是一个演示新模板的最小示例:
TEMPLATE_STR = """
{% for l in result.itervalues() %}
<div class="link">
<a href="{{ l.url }}"> {{l.title}}</a>
<img src="{{ l.img }}" width="100" height="100">
</div>
{% endfor %}
"""
from jinja2 import Template
template = Template(TEMPLATE_STR)
class democlass(object):
def getTitle(self): return "Hello world"
def getLink(self): return "google.co.uk"
def getImg(self): return "myimage.png"
class democlass2(object):
def getTitle(self): return "Foo bar"
def getLink(self): return "stackoverflow.com"
def getImg(self): return "a_photo.jpeg"
l = democlass()
m = democlass2()
dict1 = {}
dict1['l'] = { 'title': l.getTitle(), 'url': l.getLink(), 'img': l.getImg() }
dict1['m'] = { 'title': m.getTitle(), 'url': m.getLink(), 'img': m.getImg() }
print template.render(result=dict1)
这里是返回的HTML代码:
。
<div class="link">
<a href="stackoverflow.com"> Foo bar</a>
<img src="a_photo.jpeg" width="100" height="100">
</div>
<div class="link">
<a href="google.co.uk"> Hello world</a>
<img src="myimage.png" width="100" height="100">
</div>