【问题标题】:Jinja2 - Object behaving differently inside for loopJinja2 - 对象在 for 循环中表现不同
【发布时间】:2019-12-17 10:26:34
【问题描述】:

如果我使用 Jinja2 的 for 循环对其进行迭代,我有一个对象(一个名为 tortoise-orm 的 ORM 的 QuerySet 结果,但我认为这无关紧要)。

将对象tasks 视为可迭代对象。

例如,这很好用,它输出每个负责的任务的名称,这是我当前正在使用的修复:

{% for i in range(tasks|length) %}
    {% set task = tasks[i] %}
    <li>{{task.responsible.name}}</li>
{% endfor %}

但这只会创建一堆空白 &lt;li&gt; 没有错误:

{% for task in tasks %}
    <li>{{task.responsible.name}}</li>
{% endfor %}

这也很好用:

<h1>{{tasks[0].responsible.name}}</h1>

所以,在敲了很长时间之后,我认为这可能与 Jinja 如何访问 iterables 以及这个特定对象如何实现自己的 iterable 有关,但是由于我不愿意修改这两个库,所以我只是在寻找一个解决方案,也许是一个关于如何避免未来类似问题的简单解释

这里会发生什么?

【问题讨论】:

  • 你用的是什么ORM?
  • @JohnKeyes 是龟甲,可惜没有标签github.com/tortoise/tortoise-orm
  • 我以前从未使用过 Tortoise,但我只是将一个快速测试用例组合在一起,它按预期工作:{% for item in items %}...{% endfor %}。你能分享一下你是如何创建tasks的吗?

标签: python flask jinja2 quart tortoise-orm


【解决方案1】:

如果你正在处理的对象是一个生成器(而不是一个列表),一旦你通过tasks|length 使用它,就是这样。你不能重新开始。如果您确实需要它的大小,请将生成器转换为处理程序中的列表(例如,通过传递 list(tasks) 而不是 tasks

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    相关资源
    最近更新 更多