【问题标题】:Iterating through a list to create a table in Jinja, Python-Flask, SQLite遍历列表以在 Jinja、Python-Flask、SQLite 中创建表
【发布时间】:2020-11-17 00:34:04
【问题描述】:

我正在尝试在 Jinja 中使用 for loop 创建一个基本表,数据是 Python 列表,因为它是使用 fetchall() 从 SQLite 数据库中提取的。虽然我似乎找不到正确的语法。 我希望桌子是这样的:
符号 |姓名 |股票 |价格 |
苹果 |苹果| 3 | $114.86|
特斯拉 |特斯拉| 2 | $214.04|

到目前为止,这是我的代码:
蟒蛇:

@app.route("/")
@login_required
def index():
    """Show portfolio of stocks"""
    with sqlite3.connect("finance.db") as conn:
        cur = conn.cursor()
        user = session["user_id"][0]
        cur.execute("SELECT symbol, name, SUM(shares), price FROM transactions WHERE username=? GROUP BY symbol", (user[0],))
        index_table = cur.fetchall()
      
    return render_template("index.html", index_table=index_table)

print(index_table) 输出类似[('AAPL', 'Apple, Inc.', 2, 119.95), ('TSLA', 'Tesla, Inc.', 12, 407.0)] 的列表

神社模板:

{% extends "layout.html" %}


{% block body %}

<table>
{% for row in index_table %}
    <tr>
        <td>{{ row }}</td>
        <td> {{ row }}</td>
        <td> {{ row }}</td>
        <td> {{ row }}</td>
    </tr>
{% endfor %}
</table>

{% endblock %}

我也试过了:

{% extends "layout.html" %}


{% block body %}

<table>
{% for row in index_table %}
    <tr>
        <td>{{ row[0] }}</td>
        <td> {{ row[1] }}</td>
        <td> {{ row[2] }}</td>
        <td> {{ row[3] }}</td>
    </tr>
{% endfor %}
</table>

{% endblock %}

Jinja 文档中的这一行让我想知道 Jinja 是否只接受字典而不接受列表: “模板变量由传递给模板的上下文字典定义。” 这句话对我来说有点神秘,但也许有经验的人可以解释一下?

如果是这种情况,那么我不确定如何将此列表映射到字典,因为它的长度和大小会波动。我对字典理解的理解仅限于... dictionary = {key:value for vars in iterable}

提前致谢!

【问题讨论】:

  • 嗨,你的第二个例子看起来很对。输出是什么样的?
  • 谢谢克里斯蒂安。表格应该在的网页区域是空白的。
  • 我想知道它还能是什么。该站点的其他页面仍按预期运行,并且都具有某种 Jinja 功能:注册、登录、报价和购买都有一个单独的页面。

标签: python list for-loop variables jinja2


【解决方案1】:

你的第二个例子似乎是正确的。您可以使用 {% for item in seq %}..{% endfor %} 迭代 Jinja 模板中的任何序列(请参阅 docs

在您的情况下,item 是一个列表,可以使用下标语法 row[n] 甚至使用属性语法 row.n 来访问这些项目,其中 n 是项目中从 0 开始的索引列表。

所以这意味着

<table>
  {%- for row in index_table %}
  <tr>
    <td>{{ row[0] }}</td>
    <td>{{ row[1] }}</td>
    <td>{{ row[2] }}</td>
    <td>{{ row[3] }}</td>
  </tr>
  {%- endfor %}
</table>

等于

<table>
  {%- for row in index_table %}
  <tr>
    <td>{{ row.0 }}</td>
    <td>{{ row.1 }}</td>
    <td>{{ row.2 }}</td>
    <td>{{ row.3 }}</td>
  </tr>
  {%- endfor %}
</table>

另一种选择是解压缩内部列表的项目:

<table>
  {%- for symbol, name, sum_shares, price in index_table %}
  <tr>
    <td>{{ symbol }}</td>
    <td>{{ name }}</td>
    <td>{{ sum_shares }}</td>
    <td>{{ price }}</td>
  </tr>
  {%- endfor %}
</table>

或者,也可以使用 for 循环遍历内部列表:

<table>
  {%- for row in index_table %}
  <tr>
    {%- for col in row %}
    <td>{{ col }}</td>
    {%- endfor %}
  </tr>
  {%- endfor %}
</table>

示例已使用以下版本进行测试:

Flask==1.1.2
Jinja2==2.11.2

【讨论】:

  • 非常感谢您的评论。不幸的是,这些选项都没有解决这个问题。虽然令人放心的是我正确地编写了代码。我想知道它还能是什么……所有其他页面(注册、登录、报价和购买)都按预期工作。
  • 刚刚解决了。它应该是 {% block main %} 而不是 {block body%]。我真的希望你不要觉得你在浪费时间。获得额外的支持激励并鼓励我坚持并以不同的方式看待我的代码。所以谢谢你。
猜你喜欢
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2017-05-07
  • 2020-07-18
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多