jinja2 - how to put a block in an if statement?

PythonPython 2.7If StatementFlaskJinja2

Python Problem Overview


I am trying to use an if to determine which block should fill my {% block content %}.

I have a base.html which has a default {% block content %} and this template is extending base.html. So I tried this:

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

and I was expecting to see blah blah blah blah if condition was true and see the default block if it wasn't true.

But both times I got blah blah blah blah.

Then I tried this one:

{% 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 %}

and I got this error:

TemplateAssertionError: block 'content' defined twice

How can I put a block inside an if statement?

Python Solutions


Solution 1 - Python

You cannot make a {% block %} conditional; once you use the tag, the block is always going to be filled in.

Put your conditional inside the block instead, and use super() to instruct Jinja to use the original contents of the block as defined in the template:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTaxelloolView Question on Stackoverflow
Solution 1 - PythonMartijn PietersView Answer on Stackoverflow