我有要在网页上显示的对象列表(HTML文件)。 对象的类型(图形,表格等)与情况不同。
如果有图形对象,我应该加载关于图形的js和css文件。
因为当列表中没有图形对象时,我不想加载图形的js,css文件, 我已经实现了以下jinja2模板HTML文件。
{% block body %}
{% set has_graph = 0 %}
{% for item in components %}
{% if item.form == 'graph' %}
{% set has_graph = 1 %}
{% endif %}
{% endfor %}
{% if has_graph == 1 %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js"></script>
{% endif %}
{% endblock %}
我发现{%set has_graph = 1%}有效,但未加载js文件。
我不知道为什么{%if has_graph == 1%}不起作用。
答案 0 :(得分:0)
我发现set语句的范围不能超出jinja2文档(http://jinja.pocoo.org/docs/2.9/templates/#id12)中的循环。
请记住,无法在块内设置变量并将其显示在块外。这也适用于循环。该规则的唯一例外是if语句不引入范围。因此,以下模板无法实现您的预期:
{% set iterated = false %}
{% for item in seq %}
{{ item }}
{% set iterated = true %}
{% endfor %}
{% if not iterated %} did not iterate {% endif %}
使用Jinja语法无法做到这一点。
答案 1 :(得分:0)
确实,全局变量通常不在Jinja中for循环的作用域之内,这使许多人(使用Python,Java等的用户感到惊讶)。
但是,解决方法是在该外部范围内声明一个字典对象,然后在for循环中使用它:
{% set foundItem = { 'found': False } %}
{% for item in seq %}
{%- if item.form == "graph" %}
{%- if foundItem.update({'found':True}) %} {%- endif %}
{%- endif %}
{% endfor %}
{% if not iterated %} did not iterate {% endif %}
{% if foundItem.flag %} pull in graph CSS/JS {% endif %}