【问题标题】:For Loop not working in Jinja/FlaskFor Loop 在 Jinja/Flask 中不起作用
【发布时间】:2016-04-24 22:51:51
【问题描述】:

在 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 %}

问题是第一个循环工作正常,但第二个循环根本不工作。但是当我在第一个循环之前编写第二个循环时,第二个循环工作但不是第一个循环(它进入 else 并打印“未找到产品”)。

我无法理解这个问题。

【问题讨论】:

    标签: mongodb flask jinja2 pymongo


    【解决方案1】:

    看起来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 %}
    

    【讨论】:

    • 是的,我尝试在模板中倒带,但这也会在页面上打印对象光标,这是不需要的。但是将其转换为列表效果很好。
    • @ArpitKanodia,我更新了一个例子。使用 {% set _stub = output.rewind() } 可以解决此问题,将不需要的输出输出到模板。
    • Thnx 这行得通,我从来不知道 set 的这个属性。毕竟我是 Flask & Jinja 的新手。 :P
    【解决方案2】:

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

    output.rewind()
    

    我不确定您是否可以在 Jinja 模板本身中执行此操作。

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

    output_as_list = list(output) 
    

    现在您应该可以按照预期的方式在代码中使用output_as_list

    【讨论】:

    • 是的,我认为这是光标问题,无法再次迭代数据。但是我无法在 jinja 模板中倒带。 Thnxs 这很好用。
    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多