Un nodo viene creato da ogni tag. Puoi avere un'idea di come funziona leggendo attraverso how to write custom tags. Tutto ciò che è all'interno del tag sarà i suoi figli. Ecco un esempio di un tag di commento da Django docs:
def do_comment(parser, token):
nodelist = parser.parse(('endcomment',))
parser.delete_first_token()
return CommentNode()
come vedi tag di commento analizzerà tutto fino a quando il "endcomment" e getterà via. Altri tag passerebbero da nodelist
a SometagNode()
e lo utilizzeranno per il rendering.
Il rendering viene eseguito in modo ricorsivo. Quando viene richiamato un rendering() sul nodo, esegue il rendering sui suoi figli e così via.
analisi viene fatta in modo ricorsivo e questo è il motivo per cui è possibile ottenere i tag annidati e parser.parse()
riuscirà a trovare il giusto abbinamento tag di chiusura, perché quando lo fa il parsing e inciampa su un tag che chiama do_tag()
cosa, che a sua volta chiamata il parser.parse()
di nuovo per trovare il tag di chiusura più vicino e avvolgerà tutto in un nodo, restituirà un nodo, il parser.parse() più alto lo metterà in un elenco di nodi e continuerà a cercare il tag di chiusura.
L'oggetto di contesto nei nodi è un tipo di elenco di struttura di dicts. Il contesto aggiuntivo viene inserito sopra il contesto esistente e passato ai nodi figli e visualizzato dopo il rendering del nodo, in modo che non influenzi l'ambito superiore.
Per i tag che non hanno figli, lo parser.parse()
non viene utilizzato e quindi l'istanza del nodo viene restituita senza figli.
Ho iniziato a leggere 'django.template.base', ma sono uscito non appena ho percepito una magia potente e in grado di piegare il tempo (come goto 5am). I'll upvote e check in al mattino invece :) –
L'ho messo nella mia lista delle cose da fare! –