Джинджа, если заявление не выполняется должным образом - PullRequest
0 голосов
/ 09 сентября 2018

Я использую 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 голосов
/ 09 сентября 2018

Вы не можете использовать block в таком условии, как это, независимо от того, выполнено ли условие или нет, как только вы добавите block в свой дочерний шаблон, оно будет заполнено.

Есть несколько способов достичь (что я предполагаю) того, что вы хотите, например, вы можете использовать макрос :

{% 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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...