【问题标题】:I am passing python objects to a template (using jinja) and it is not working for one template but does for the others我将 python 对象传递给模板(使用 jinja),它不适用于一个模板,但适用于其他模板
【发布时间】:2023-03-05 17:53:01
【问题描述】:

我有一个国家对象列表,其中包含名称、大陆、人口、缩写等属性,我只是试图将该对象传递给 html 模板。我有其他路线都编码相同,工作正常,但由于某种原因,国家对象作为字符串传递,列表似乎是空的。

@app.route('/continents/<continent>/<country>')
def countryView(country, continent):
    countries = []
    for c in countriesWorld:
        if c.continent == continent:
            countries.append(c)
        if c.name == country:
            country = c
    return render_template('countryview.html', country=country,        
countries=countries), 200

这是我的 html/jinja 模板

{% extends "base.html" %}
{% block content %}
    <div id="countrycontainer">
        <h1>{{ country.name }}</h1>
        <img src="{{ "../static/img/flags/" ~ country.abbreviation ~ ".png" 
}}">
</div>

{% endblock %}}

如果我使用 '{{ country }} 而不是国家/地区名称,则会显示该名称,因此很明显它已作为字符串而不是对象传递,我无法弄清楚原因。任何帮助将不胜感激

【问题讨论】:

  • 很难准确地说出问题是什么,但您有两件事需要密切关注:1.countriesWorld可能为空,这意味着country的值永远不会改变了。或者2.if c.name == country永远不会变成True,这也意味着country的值永远不会改变。尝试打印 c.namecountry 以确保它们确实匹配。
  • 感谢您的回复。 countryWorld 是一个国家对象列表,可以毫无问题地传递给其他路线,并且永远不会改变。它会在 app.py 加载时从 csv 文件中提取信息,所以我不明白为什么它会是空的,最重要的是,如果我在模板中只使用 {{county}} 而不是 {{ country.name}},然后会显示国家名称。
  • 显示国家名称是因为它已经被定义了。你看,函数countryView 有一个名为country 的参数。正是该国家/地区被传递给您的模板。因此,再次检查以确保 c.name == country 的计算结果为 True
  • 因此,在 csv 文件中,国家/地区名称的结尾有一个空格字符,这就是 c.name==country 评估为假的原因。非常感谢您的帮助,它现在可以正常工作了!

标签: python flask jinja2


【解决方案1】:

尾随空格是导致问题的原因,由于这个尾随空格,country == c.name 从未评估为 true,因此作为字符串的原始变量 'country' 被传递给视图。

【讨论】:

    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2017-12-12
    • 2015-07-23
    • 2013-01-07
    • 2023-03-28
    相关资源
    最近更新 更多