Z każdego tagu tworzony jest węzeł. Możesz dowiedzieć się, jak to działa, czytając pod numerem how to write custom tags. Wszystko, co znajduje się wewnątrz znacznika, będzie jego dziećmi. Oto przykład znacznika komentarza od django docs:
def do_comment(parser, token):
nodelist = parser.parse(('endcomment',))
parser.delete_first_token()
return CommentNode()
jak widać komentarz tag będzie analizować wszystko do „endcomment” i będzie go wyrzucić. Inne tagi będą przechodzić nodelist
do SometagNode()
i będą używać go do renderowania.
Renderowanie jest wykonywane rekurencyjnie. Po wywołaniu metody render() w węźle uruchamia ona render na swoich elementach podrzędnych i tak dalej.
Przetwarzanie odbywa się rekurencyjnie, jak również to, dlaczego można uzyskać zagnieżdżone znaczniki i parser.parse()
uda się znaleźć odpowiedniego dopasowania zamykający znacznik, bo gdy to robi analizowania i potyka się na znaczniku wywołuje do_tag()
coś, co z kolei wywoła parser.parse()
ponownie, aby znaleźć najbliższy tag zamykający i zawiąże wszystko w węźle, zwróci węzeł, wyższy parser.parse() umieści go na liście węzłów i będzie kontynuował wyszukiwanie zamykającego tagu.
Obiekt kontekstowy w węzłach jest swego rodzaju listą struktur dyktowanych. Dodatkowy kontekst jest wypychany na wierzch istniejącego kontekstu i przekazywany do węzłów podrzędnych i wyskakuje po wyrenderowaniu węzła, aby nie wpływał na zakres górny.
W przypadku znaczników, które nie mają potomków, parser.parse()
nie jest używany, a zatem wystąpienie węzła jest zwracane bez żadnych elementów podrzędnych.
Zacząłem czytać 'django.template.base', ale wyszedłem, gdy tylko wyczułem potężną, czasową magię (jak goto 5am). Przerobię i sprawdzę rano :) –
Położyłem to na mojej liście rzeczy do zrobienia! –