Порядок разбора шаблона Django - PullRequest
3 голосов
/ 26 февраля 2011

Указан ли порядок разбора шаблонов Django где-то в документации Django?

На основании документации для написания пользовательских тегов шаблонов и API, похоже, Django использует глубинуобход для построения дерева узлов.Тем не менее, я не могу найти никаких утверждений в документации Django, которые бы это гарантировали.В частности, я хотел бы знать, если дерево узлов полностью собрано до любого рендеринга.

Кроме того, как это влияет на наследование шаблона?Теги {% block ... %} в производном шаблоне анализируются по их расположению в базовом шаблоне или они анализируются тегом {% extends "..." %} перед базовым шаблоном?

1 Ответ

2 голосов
/ 26 февраля 2011

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

А как насчет наследования? Как визуализируется корневой узел exteds? Ну, я не разобрался здесь с ролью контекста, но есть ExtendsNode , который создается тегом шаблона extends. Этот тип узла получает имя родительского шаблона (ваш базовый шаблон) и контекст со всеми переменными, блоками и узлами дочернего шаблона (тот, который вы фактически вызываете для визуализации). Поэтому, когда этот узел отображается, он делает то же самое, что и каждый узел, добавляя свои дочерние узлы. Основное отличие этого класса заключается в том, что он получает узлы, помеченные тегом шаблона блока, из контекста дочернего шаблона и добавляет его везде, где вы определили тег шаблона блока с этим именем в родительском шаблоне.

Таким образом, сначала создаются узлы, и тегу шаблонов extends удается получить их при визуализации шаблона.

Если вы хотите узнать, как создаются узлы, вы можете найти класс Token and Parser в коде Django.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...