【问题标题】:How to get a Python dict into an HTML template using Flask/Jinja2如何使用 Flask/Jinja2 将 Python 字典放入 HTML 模板
【发布时间】:2015-06-15 07:58:48
【问题描述】:

我正在尝试在 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 中没有错误日志。

【问题讨论】:

    标签: python html dictionary flask jinja2


    【解决方案1】:

    问题是您正在迭代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 %}
    

    我相信这应该会让你得到你想要的行为。


    请注意,这将以随机顺序返回值(因为遍历字典是随机的)。如果要按键排序,可以修改模板如下:

    {% 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>
    

    【讨论】:

    • 非常感谢您的回答。这正是问题所在!
    【解决方案2】:
    # 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>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-13
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      相关资源
      最近更新 更多