如何使用 Flask/Jinja2 将 Python 字典放入 HTML 模板
How to get a Python dict into an HTML template using Flask/Jinja2
我正在尝试在 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中没有错误日志。
问题是您正在迭代 iteritems()
,它是(键,值)对的迭代器。这意味着 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 %}
我相信这应该能让你得到你想要的行为。
请注意,这将 return 值以随机顺序排列(因为遍历字典是随机的)。如果想按键排序,可以修改模板如下:
{% 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 "whosebug.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 它 returns:
<div class="link">
<a href="whosebug.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>
# 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>
我正在尝试在 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中没有错误日志。
问题是您正在迭代 iteritems()
,它是(键,值)对的迭代器。这意味着 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 %}
我相信这应该能让你得到你想要的行为。
请注意,这将 return 值以随机顺序排列(因为遍历字典是随机的)。如果想按键排序,可以修改模板如下:
{% 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 "whosebug.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 它 returns:
<div class="link">
<a href="whosebug.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>
# 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>