如何使用Flask/Jinja2将Python字典传递到HTML模板中

3
我尝试在 HTML 文件中使用 Python 字典。该字典通过 Flask 中的 render_template 函数传递给 HTML 模板。
该字典的格式如下:
dict1[counter] =  {
    'title': l.getTitle(),
    'url': l.getLink(),
    'img': l.getImg()
}

然后,在我想要遍历这个字典的 HTML 模板中:
{% for l in result.iteritems() %}
<div class="link">
            <a href="{{ l.url }}"> {{l.title}}</a>
            <img src="{{ l.img }}" width="100" height="100">
</div>
{% endfor %}

我不知道问题出在哪里,因为 Flask 中没有错误日志。
2个回答

3
问题在于你正在遍历 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>

非常感谢你的回答。那正是问题所在! - Alice1

0
# Python Code

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
def index():
    k = {
            "Movie" : "KGF Chapter 1",
            "Director" : "Prashant Neel",
            "Antagonist" : "Adheera"
        }

    return render_template("index.html", k=k)

if __name__ == "__main__":
    app.run(debug = True)

<!-- Below is the HTML Code : --> 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>


<body>

    <h1> Your dictionary is here : {{k}} </h1>
    

</body>

</html>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接