Django-fr

Forum

  • Accueil
  • » Django-fr
  • » templates : listage recursif des noeuds d'un template, par type ?

#1 04-03-2010 18:47:06

Jérémie Ducastel
Membre
Inscription : 11-08-2010
Messages : 16

templates : listage recursif des noeuds d'un template, par type ?

bonjour,

je cherche à lister tous les noeuds d'un type pour une instance de
template.

J'ai bien vu dans le code source que les instances de template possedaient
un attribut nodelist, instance de NodeList qui possede une methode
get_nodes_by_type(). Helas celle ci ne semble pas recursive; on n'obtient
pas les noeuds à l'interieur des {% block %} par exemple, et de plus pour un
template en etendant un autre le nodelist semble ne contenir que le noeud {%
extends %}

Quelqu'un a t'il déjà codé ça ou sait-il comment procéder ?

Hors ligne

#2 05-03-2010 12:57:47

neakdo neakdo
Membre
Inscription : 11-08-2010
Messages : 2

Re : templates : listage recursif des noeuds d'un template, par type ?

Bonjour,

Lorsque tu parcours NodeList, tu obtiens une liste de Node dont
certains peuvent correspondre à des extends, includes ou block.
Pour information, ces noeuds extends, includes et block seront
respectivement en object de type ExtendsNode, IncludeNode et BlockNode
(pour plus d'information consulte le fichier
django/template/loader_tags.py)

Donc pour ta récursivité, il te suffit pour chacun des nodes de ta
NodeList de détecter si ce node est de type ExtendsNode ou
IncludeNode.
Si le node est un object ExtendsNode, il possède une nodelist que tu
pourras parcourir.
Si c'est un objet de type IncludeNode, il possède un attribut
template_name à partir duquel tu peux récupérer un objet de Template
qui lui possèdera une nodelist que tu pourras parcourir.

Par exemple :

def fun_recur(nodelist, plist, blist):

    for node in nodelist:

        if type(node).__name__=='instance':
            if node .__class__.__name__=='ExtendsNode':
                fun_recur(node.get_parent(Context()).nodelist )


        if type(node).__name__=='instance':
            if node .__class__.__name__=='ConstantIncludeNode':
                fun_recur(node.template.nodelist)

J'espère que ça pourra t'aider,

Philippe




Le 4 mars 2010 18:47, Jérémie Ducastel <jeremie _AT_ ducastel.name> a écrit :
> bonjour,
> je cherche à lister tous les noeuds d'un type pour une instance de
> template.
> J'ai bien vu dans le code source que les instances de template possedaient
> un attribut nodelist, instance de NodeList qui possede une methode
> get_nodes_by_type(). Helas celle ci ne semble pas recursive; on n'obtient
> pas les noeuds à l'interieur des {% block %} par exemple, et de plus pour un
> template en etendant un autre le nodelist semble ne contenir que le noeud {%
> extends %}
> Quelqu'un a t'il déjà codé ça ou sait-il comment procéder ?
>
> --
> http://jeremie.ducastel.name
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

  • Accueil
  • » Django-fr
  • » templates : listage recursif des noeuds d'un template, par type ?

Pied de page des forums