Ответ - да, все узлы создаются при создании объекта Template. Но магия происходит, когда вы вызываете метод рендеринга этого объекта. У этого объекта Template есть NodeList, который отображается в контексте. Этот рендеринг выполняется, как вы сказали ранее, сначала глубина, и он просто добавляет внутренние дочерние строки (html) к родительскому узлу. Вот класс NodeList , в котором выполняется рендеринг узла. Таким образом, корневой узел - это тот, который добавляет все узлы, добавленные к нему, для окончательной генерации файла. И если вы помните, тег шаблона extends должен быть первым в шаблоне, чтобы он становился корневым узлом, который получает все уже отрисованные узлы в нем.
А как насчет наследования? Как визуализируется корневой узел exteds? Ну, я не разобрался здесь с ролью контекста, но есть ExtendsNode , который создается тегом шаблона extends. Этот тип узла получает имя родительского шаблона (ваш базовый шаблон) и контекст со всеми переменными, блоками и узлами дочернего шаблона (тот, который вы фактически вызываете для визуализации). Поэтому, когда этот узел отображается, он делает то же самое, что и каждый узел, добавляя свои дочерние узлы. Основное отличие этого класса заключается в том, что он получает узлы, помеченные тегом шаблона блока, из контекста дочернего шаблона и добавляет его везде, где вы определили тег шаблона блока с этим именем в родительском шаблоне.
Таким образом, сначала создаются узлы, и тегу шаблонов extends удается получить их при визуализации шаблона.
Если вы хотите узнать, как создаются узлы, вы можете найти класс Token and Parser в коде Django.
Надеюсь, это поможет.