web-dev-qa-db-fra.com

jinja2 - comment mettre un bloc dans une instruction if?

J'essaie d'utiliser un if pour déterminer quel bloc doit remplir mon {% block content %}.

J'ai un base.html qui a une valeur par défaut {% block content %} et ce modèle étend base.html. J'ai donc essayé ceci:

{% extends "base.html" %}
{% if condition == True %}
    {% block content %}
    <div>blah blah blah blah</div>
    {% endblock content %}
{% endif %}

et je m'attendais à voir blah blah blah blah si la condition était vraie et voir le bloc par défaut s'il n'était pas vrai.

Mais les deux fois j'ai eu blah blah blah blah.

Ensuite, j'ai essayé celui-ci:

{% extends "base.html" %}
{% if condition == True %}
    {% block content %}
    <div>blah blah blah blah</div>
    {% endblock content %}
{% else %}
    {% block content %}
    <div>The Default Thing</div>
    {% endblock content %}
{% endif %}

et j'ai eu cette erreur:

TemplateAssertionError: block 'content' defined twice

Comment puis-je placer un bloc dans une instruction if?

37
Taxellool

Vous ne pouvez pas rendre un {% block %} Conditionnel; une fois que vous utilisez la balise, le bloc sera toujours rempli.

Mettez votre conditionnel à l'intérieur le bloc à la place, et utilisez super() pour demander à Jinja d'utiliser le contenu original du bloc tel que défini dans le modèle:

{% extends "base.html" %}
{% block content %}
    {% if condition %}
        <div>blah blah blah blah</div>
    {% else %}
        {{ super() }}
    {% endif %}
{% endblock content %}
54
Martijn Pieters