jinja2 - 如何在if语句中放置一个块?

69 投票
1 回答
134739 浏览
提问于 2025-04-17 23:56

我想用一个if语句来决定我的{% block content %}应该填充哪个内容。

我有一个base.html文件,它里面有一个默认的{% block content %},而这个模板是从base.html扩展出来的。所以我试了这个:

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

我本来期待如果条件成立,就能看到blah blah blah blah,如果条件不成立,就能看到默认的内容。

但是无论如何,我都只看到了blah blah blah blah

然后我又试了这个:

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

结果我收到了这个错误:

TemplateAssertionError: block 'content' defined twice

我该如何在if语句里面放一个块呢?

1 个回答

114

你不能让 {% block %} 这个标签变成条件的;一旦你使用了这个标签,这个块就会一直被填充。

相反,你应该把条件放在这个块 内部,然后用 super() 来告诉 Jinja 使用模板中定义的这个块的原始内容:

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

撰写回答