Узел создается из каждого тега.Вы можете понять, как это работает, прочитав , как писать собственные теги .Все, что находится внутри тега, будет его потомком.Вот пример тега комментария из django docs:
def do_comment(parser, token):
nodelist = parser.parse(('endcomment',))
parser.delete_first_token()
return CommentNode()
, как вы видите, тег комментария будет анализировать все до «конца» и выбрасывает его.Другие теги будут передавать nodelist
в SometagNode()
и будут использовать его для рендеринга.
Рендеринг выполняется рекурсивно.Когда render () вызывается на узле, он запускает render на своих дочерних элементах и т. Д.
Разбор также выполняется рекурсивно, поэтому вы можете получить вложенные теги, и parser.parse()
удастся найти правильное соответствиезакрывающий тег, потому что, когда он выполняет синтаксический анализ и запинается в теге, он вызывает do_tag()
вещь, которая, в свою очередь, снова вызовет parser.parse()
, чтобы найти ближайший закрывающий тег, и обернет все в узел, вернет узел, чем вышеparser.parse () поместит его в список узлов и продолжит поиск закрывающего тега.
Объект контекста в узлах является своего рода структурой списка dicts.Дополнительный контекст помещается поверх существующего контекста и передается дочерним узлам и выводится после визуализации узла, чтобы он не влиял на верхнюю область.
Для тегов, которые не имеют дочерних элементов, parser.parse()
не используется, и поэтому экземпляр узла возвращается без дочерних элементов.