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] %}
希望这可以帮助别人试图找出相同的。