可重复使用的应用程序,仅在未定义时定义块

时间:2013-08-09 19:49:14

标签: django django-templates

我的应用使用django的消息中间件。

在此应用的基本模板中,我有:

{% extends "base.html" %}

{% block messages %}
<ul class="messagelist">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}_message"{% endif %}>{{ message|capfirst }}</li>
    {% endfor %}
</ul>
{% endblock messages %}

问题是,这会覆盖网站范围base.html中的“消息”块。

因此,如果我在网站库中定义了样式,如下例所示:

{% block messages %}
{% if messages %}
    <ul class="messagelist ui-state-highlight">
    {% for message in messages %}
        <li{% if message.tags %} class="{{ message.tags }}_message"{% endif %}>{{ message|capfirst }}</li>
    {% endfor %}
    </ul>
{% endif %}
{% endblock messages %}

我的'可重复使用'模板会删除ui-state-highlight ...

任何方式我都可以在我的应用基础中定义阻止消息,只有它没有定义?

1 个答案:

答案 0 :(得分:3)

如果我按照您要执行的操作进行操作 - 编写一个应用程序,如果需要,将为块提供内容,但如果可用则使用其父模板的块 - 我认为应该这样做:

{% extends "base.html" %}
{% block messages %}
    {% if block.super %}
        {{ block.super }}
    {% else %}
        <ul class="messagelist">
        {% for message in messages %}
            <li{% if message.tags %} class="{{ message.tags }}_message"{% endif %}>{{ message|capfirst }}</li>
        {% endfor %}
        </ul>
    {% endif %}
{% endblock %}

但是,这是未经测试的 - block.super可能奇怪地工作。并且它不会区分您的父模板根本没有定义messages块和定义空块。