Jinjavariables的作用域是否可以扩展到内部块?

我有以下Jinja模板:

{% set mybool = False %} {% for thing in things %} <div class='indent1'> <ul> {% if current_user %} {% if current_user.username == thing['created_by']['username'] %} {% set mybool = True %} <li>mybool: {{ mybool }}</li> <!-- prints True --> <li><a href='#'>Edit</a></li> {% endif %} {% endif %} <li>Flag</li> </ul> </div> <hr /> {% endfor %} {% if not mybool %} <!-- always prints this --> <p>mybool is false!</p> {% else %} <p>mybool is true!</p> {% endif %} 

如果在for循环中满足条件,我想将mybool改为true,这样我可以显示mybool is true! 下面。 但是,看起来内部mybool的范围仅限于if语句,所以所需的 mybool从不设置。

我怎样才能设置“全局” mybool所以我可以在最后的if语句中使用它?

编辑

我发现了一些build议 (只有caching的页面浏览正确),但他们似乎并没有工作。 也许他们已经在Jinja2弃用了…

编辑

解决scheme如下。 我仍然好奇为什么上面的build议不起作用。 有谁知道肯定,他们被弃用?

解决此限制的一个方法是启用“do”expression式语句扩展,并使用数组而不是布尔值:

 {% set exists = [] %} {% for i in range(5) %} {% if True %} {% do exists.append(1) %} {% endif %} {% endfor %} {% if exists %} <!-- exists is true --> {% endif %} 

要启用Jinja的“do”expression式语句扩展: e = jinja2.Environment(extensions=["jinja2.ext.do",])

回答一个相关的问题:我想拥有一个全局的计数器,我在模板中input了一个if-block的次数,最后是下面的结果。

在模板的顶部:

 {% set counter = ['1'] %} 

在if块中,我想要计数:

 {% if counter.append('1') %}{% endif %} 

显示计数时:

 {{ counter|length }} 

我相信,string'1'可以用任何string或数字replace。 这仍然是一个黑客,但不是一个很大的。

你可以使用这个黑客(没有扩展)来解决你的问题:

 import jinja2 env = jinja2.Environment() print env.from_string(""" {% set mybool = [False] %} {% for thing in things %} <div class='indent1'> <ul> {% if current_user %} {% if current_user.username == thing['created_by']['username'] %} {% set _ = mybool.append(not mybool.pop()) %} <li>mybool: {{ mybool[0] }}</li> <!-- prints True --> <li><a href='#'>Edit</a></li> {% endif %} {% endif %} <li>Flag</li> </ul> </div> <hr /> {% endfor %} {% if not mybool[0] %} <!-- always prints this --> <p>mybool is false!</p> {% else %} <p>mybool is true!</p> {% endif %} """).render(current_user={'username':'me'},things=[{'created_by':{'username':'me'}},{'created_by':{'username':'you'}}]) 

在编写contextfunction()或类似的东西时,你可能已经注意到上下文试图阻止你修改它。

如果您已经设法通过使用内部上下文API来修改上下文,您可能已经注意到上下文中的更改似乎在模板中不可见。 这是因为性能原因, Jinja仅将上下文用作模板variables的主要数据源。

如果要修改上下文,请编写一个返回variables的函数,而不是通过使用set赋予variables:

{% set comments = get_latest_comments() %}

资源

如果需要从列表(objects_from_db)中find对象(对象)中的最大条目数,

这在jinja2和variables范围中已知的原因不起作用。

  {% set maxlength = 0 %} {% for object in objects_from_db %} {% set ilen = object.entries | length %} {% if maxlength < ilen %} {% set maxlength = ilen %} {% endif %} {% endfor %} 

这是什么工作:

  {% set mlength = [0]%} {% for object in objects_from_db %} {% set ilen = object.entries | length %} {% if mlength[0] < ilen %} {% set _ = mlength.pop() %} {% set _ = mlength.append(ilen)%} {% endif %} {% endfor %} {% set maxlength = mlength[0] %} 

希望这可以帮助别人试图找出相同的。