我正在使用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>
我希望块将取决于计数器的值,但是相反,它将全部更改。
我很好奇这个错误触发的原因
答案 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 %}