2009-10-05 13 views

Répondre

11

Vous utilisez un CallBlock, ce qui indique que vous souhaitez que votre extension fasse office de bloc. Par exemple.

{% mytest arg1 arg2 %} 
stuff 
in 
here 
{% endmytest %} 

nodes.CallBlock vous attend à ce que passer une liste des noeuds représentant le corps (les états internes) pour votre poste. Actuellement c'est où vous passez None - d'où votre erreur. Une fois que vous avez analysé vos arguments, vous devez procéder à l'analyse du corps du bloc. Heureusement, c'est facile. Vous pouvez simplement faire:

body = parser.parse_statements(['name:endmytest'], drop_needle=True) 

puis de retourner un nouveau nœud. Le CallBlock reçoit une méthode à appeler (dans ce cas _mytestfunc) qui fournit la logique de votre extension.

body = parser.parse_statements(['name:endmytest'], drop_needle=True) 
return nodes.CallBlock(self.call_method('_mytestfunc', args),[], [], body).set_lineno(lineno) 

Sinon, si vous ne voulez pas que votre extension soit une balise de bloc, par exemple

{% mytest arg1 arg2 %} 

vous ne devriez pas utiliser nodes.CallBlock, vous devez simplement utiliser nodes.Call à la place, qui ne prend pas un paramètre de corps. Il suffit donc de faire:

return self.call_method('_mytestfunc', args) 

self.call_method est simplement une fonction d'emballage pratique qui crée un nœud d'appel pour vous. J'ai passé quelques jours à écrire des extensions Jinja2 et c'est compliqué. Il n'y a pas beaucoup de documentation (autre que le code). Le projet GitHub cercueil a quelques exemples d'extensions here.

+0

ou définir le corps à [] ... http://stackoverflow.com/questions/5972458/help-with-custom-jinja2-extension ... anyhoo, cette question n'est plus ... mais au moins votre lien est très utile – StefanNch