2011-02-25 3 views
3

L'ordre d'analyse des templates Django est-il spécifié quelque part dans la documentation de Django? Selon la documentation de writing custom template tags et de l'API, il semble que Django utilise une traversée en profondeur pour construire l'arborescence de nœuds. Cependant, je ne trouve aucune déclaration dans la documentation de Django qui le garantisse. En particulier, je voudrais savoir si l'arbre des noeuds est complètement assemblé avant tout rendu est fait.Ordre d'analyse des modèles Django

En outre, comment cela affecte-t-il l'héritage de modèle? Les balises {% block ... %} du modèle dérivé sont-elles analysées à leur emplacement dans le modèle de base ou sont-elles analysées par la balise {% extends "..." %} avant le modèle de base?

Répondre

2

La réponse est oui, tous les nœuds sont créés lorsque vous créez un objet Modèle. Mais la magie se produit lorsque vous appelez la méthode de rendu de cet objet. Cet objet Template possède une NodeList qui est rendue dans un contexte. Ce rendu est fait comme vous l'avez dit auparavant, la profondeur en premier, et il vient juste d'ajouter les chaînes enfantines (html) au nœud père. Here is the NodeList class où le rendu du noeud est terminé. Ainsi, le nœud racine est celui qui obtient l'ajout de tous les nœuds pour finalement générer le fichier. Et si vous vous en souvenez, la balise étendues de template doit être la première dans le template afin qu'elle devienne le nœud racine qui y récupère tous les nœuds déjà rendus.

Maintenant, qu'en est-il de l'héritage? Comment est rendu le noeud racine des extensions? Eh bien, je n'ai pas tout compris sur le rôle du contexte ici, mais il y a un ExtendsNode qui est créé par la balise extends template. Ce type de noeud reçoit le nom du modèle parent (votre modèle de base) et un contexte avec toutes les variables, blocs et noeuds du modèle enfant (celui que vous appelez réellement pour le rendu). Ainsi, lorsque ce noeud est rendu, il fait la même chose que tous les autres, ajouter ses nœuds fils. La principale différence dans cette classe est qu'elle obtient les nœuds marqués avec la balise de modèle de bloc dans le contexte de modèle de l'enfant, et l'ajoute partout où vous avez défini une balise de modèle de bloc avec ce nom dans le modèle parent. Par conséquent, les noeuds sont créés en premier et la balise étendues de gabarit parvient à les obtenir lorsque vous restituez le gabarit.

Si vous voulez savoir comment les nœuds ont été créés, vous pouvez rechercher the Token and Parser class au code Django.

Espérons que cela aide.

+0

Désolé si c'est difficile à lire, mais je ne suis pas très bon en anglais ... – FernandoEscher

+0

comme je l'ai mentionné dans ma question, je sais que c'est ce qui est actuellement mis en œuvre. Cependant, j'aimerais avoir un pointeur vers la documentation qui me permet de conclure que ce n'est pas juste un détail d'implémentation. Je préfère me fier à des mécanismes qui ne changeront probablement pas dans les versions futures. –

+0

+1 pour une bonne réponse et me faire réaliser que la source django est sur github! Je continuais à aller à djangoproject.com chercher la source –