Jinja如果语句不能正确执行

时间:2018-09-09 18:34:18

标签: flask

我正在使用Jinja + Flask

这是示例代码:

# Flask
@app.route('/test/<int:counter>'):
    return render_templates('test.html', counter)

# Jinja
## test.html
{% extends "layout.html" %}
{% if counter|int == 1 %}
{% block scoreboard1 %}active1{% endblock %}
{% elif counter|int == 2 %}
{% block scoreboard2 %}active2{% endblock %}
{% elif counter|int == 3 %}
{% block scoreboard3 %}active3{% endblock %}
{% else %}
{% endif %}

## layout.html
<a href="/scoreboard/1" class="{% block scoreboard1 %}{% endblock %} item">1</a>
<a href="/scoreboard/2" class="{% block scoreboard2 %}{% endblock %} item">2</a>
<a href="/scoreboard/3" class="{% block scoreboard3 %}{% endblock %} item">3</a>

这是结果(在chrome dev工具中检查):

# URL -> 127.0.0.1/test/2
<a href="/scoreboard/1" class="active1 item">1</a>
<a href="/scoreboard/2" class="active2 item">2</a>
<a href="/scoreboard/3" class="active3 item">3</a>

预期结果:

# URL -> 127.0.0.1/test/2
<a href="/scoreboard/1" class=" item">1</a>
<a href="/scoreboard/2" class="active2 item">2</a>
<a href="/scoreboard/3" class=" item">3</a>

我希望块将取决于计数器的值,但是相反,它将全部更改。

我很好奇这个错误触发的原因

1 个答案:

答案 0 :(得分:2)

无论条件是否满足,都不能在这样的条件中使用block,一旦block进入子模板,它就会被填充。

有两种方法可以实现(我假设是)您想要的,例如,您可以使用macro

{% macro scoreboardlink(counter) %}
    <a href="/scoreboard/1" class="{% if counter|int == 1 %}active1{% endif %} item">1</a>
    <!-- you should look into url_for() instead of hardcoding your urls -->
    ...
{%- endmacro %}

然后您可以像这样在模板中使用它:

...
{{ scoreboardlink(counter) }}
...

但是,如果您希望使用结构layout.html,那么您当然可以稍加调整,然后将条件放在块中:

{% block scoreboard1 %}
    {% if counter|int == 1 %}active1{% endif %}
{% endblock %}