For Loop不在Jinja / Flask工作

时间:2016-01-19 12:48:00

标签: mongodb flask jinja2 pymongo

在jinja模板中,我的代码是这样的,我试图从我的MongoDB数据库中获取值

{% for a in output %}
        {{ a.product_name }}
{% else %}
        <p> No product found </p>
{% endfor %}
Some HTML CODE
{% for b in output %}
         {{ b.product_name }}
{% endfor %}

问题是第一个循环工作正常,但第二个循环完全没有工作。但是当我在第一个循环之前编写第二个循环时,第二个循环工作,然后不是第一个循环(它进入其他内部并打印&#34;没有找到产品&#34;)。

我无法理解这个问题。

2 个答案:

答案 0 :(得分:3)

您想要两次迭代mongodb游标。因此,在第一次迭代之后,您需要在两个循环之间的某个位置调用rewind(游标)上的output方法。

output.rewind()

我不确定你是否能够在Jinja模板中做到这一点。

所以更好的选择是将pymongo游标对象转换为列表本身,这样你就可以多次迭代。

output_as_list = list(output) 

现在,您应该能够按照预期的方式在代码中使用output_as_list

答案 1 :(得分:2)

看起来outputiterator。尝试将其转换为视图函数中的list(或dict)。

您可以通过下一个代码重现此类行为:

output = (x for x in range(3))
# output = list(output)  # if uncomment this line, the problem will be fixed
for x in output:  # this loop will print values
    print(x)  

for x in output:  # this loop won't
    print(x) 

UPD:由于output是mongodb游标,您可以通过调用模板中的output.rewind() directly来回放它。

{% for a in output %}
    {{ a.product_name }}
{% else %}
    <p> No product found </p>
{% endfor %}

Some HTML CODE

{% set _stub = output.rewind() %}  {# use a stub to suppress undesired output #}

{% for b in output %}
     {{ b.product_name }}
{% endfor %}