Вложенные блоки в шаблонах Django

Шаблон master в моем приложении Django выглядит так:

{% block parent %}
    Some text...
    {% block child %}
        Default content here...
    {% endblock child %}
    ...some more text
{% endblock parent %}

Теперь этот шаблон должен быть перезаписан таким образом, чтобы был изменен блок child:

{% extends "master.html" %}

{% block child %}
    New content here...
{% endblock child%}

Однако рендеринг остается прежним (печать «содержимое по умолчанию здесь ...»). Я пропустил что-то очевидное или вложенные блоки невозможны? (Или, нарушая принцип DRY, я должен переопределить блок parent?)

Изменить: я работаю с Django 1.1, если это имеет значение.


person Boldewyn    schedule 14.12.2009    source источник
comment
Что-то еще здесь не так, потому что (также используя 1.1) я не могу воспроизвести эту проблему. Для меня простое переопределение дочернего блока без какой-либо ссылки на родительский блок дает желаемый эффект.   -  person Ben James    schedule 14.12.2009
comment
Да, ты прав. Смотрите мой ответ ниже. Спасибо, что посмотрели.   -  person Boldewyn    schedule 14.12.2009


Ответы (2)


Хорошо, это ошибка в системе шаблонов Django. В большинстве других случаев Бен Джеймс прав (см. его комментарий к моему вопросу выше).

В моем случае блок child находился внутри блока {% ifnotequal a b %}, и это нарушает наследование блоков. Я считаю это ошибкой, так как существуют десятки естественных вариантов использования таких операций.

Соответствующий билет.

person Boldewyn    schedule 14.12.2009
comment
Рекомендуется всегда тестировать код, который вы публикуете, а не предполагать, что то, что вы удалили, не повлияет на результат. - person Ben James; 14.12.2009
comment
Верно, верно... У меня изначально был собственный тег шаблона, и я подозревал об этом, но после того, как выбросил его, я не подумал о ifnotequal. - person Boldewyn; 14.12.2009

Сделай это:

{% extends "master.html" %}

{% block parent %}
    {% block child %}
        New content here...
    {% endblock child%}
{% endblock parent %}
person lprsd    schedule 14.12.2009
comment
Что, если базовый блок parent содержит что-то кроме блока child? - person Dominic Rodger; 14.12.2009
comment
Спасибо за ответ, но, к сожалению, он бесполезен. Это отчасти моя ошибка, я обновил пример для основного шаблона выше. Проблема: Основной шаблон нужен потому, что в нем больше данных. Если я сделаю так, как вы предлагаете, все эти дополнительные данные, конечно, будут потеряны. - person Boldewyn; 14.12.2009
comment
это может нарушить функциональность веб-сайта, он запрашивает 2-кратную дочернюю страницу, поэтому может дублировать теги скрипта и многое другое. - person christk; 29.02.2020