2009-02-11 5 views
3

J'utilise Jinja2, et je suis en train de créer un couple balises qui travaillent ensemble, de sorte que si j'ai un modèle qui ressemble à ceci:Comment puis-je créer une étiquette dans Jinja qui contient des valeurs de plus tard dans le modèle?

{{ my_summary() }} 
... arbitrary HTML ... 
{{ my_values('Tom', 'Dick', 'Harry') }} 
... arbitrary HTML ... 
{{ my_values('Fred', 'Barney') }} 

Je finirais avec les éléments suivants :

This page includes information about <b>Tom</b>, <b>Dick</b>, <b>Harry</b>, <b>Fred</b>, and <b>Barney</b>. 
... arbitrary HTML ... 
<h1>Tom, Dick, and Harry</h1> 
... arbitrary HTML ... 
<h1>Fred and Barney</h1> 

en d'autres termes, le my_summary() au début de la page inclut des informations fournies plus tard dans la page. Il devrait être assez intelligent pour prendre en compte les expressions qui se produisent dans les instructions include et import, ainsi.

Quelle est la meilleure façon de faire cela?

+0

@Chris B. Une chose n'est pas claire: d'où vient la liste des valeurs? Connaissez-vous les sous-listes avant que le modèle ne soit rendu? Si vous ne les connaissez pas à ce moment-là, cela semble indiquer que votre modèle prend la responsabilité du contrôleur (en parlant vaguement de MVC). –

+0

J'utilise essentiellement les modèles inclus pour dessiner des widgets, qui nécessitent certains fichiers css et js pour fonctionner. Le css et js vont dans le modèle de base, tandis que plus tard les modèles inclus rendent les widgets. Il n'y a donc aucun moyen de savoir a priori quelles bibliothèques seront nécessaires plus tard. –

Répondre

4

Avis de non-responsabilité: Je ne connais pas Jinja. Je pense que vous ne pouvez pas (facilement) accomplir cela.

je suggère l'alternative suivante:

  • passer le Tom, Dick, etc. valeurs comme variables au modèle de l'extérieur. Laissez vos balises personnalisées prendre les valeurs en tant qu'arguments.
  • Je ne sais pas ce que "l'extérieur" serait dans votre cas. Si le modèle est utilisé dans une infrastructure d'application Web, "l'extérieur" est probablement une méthode de contrôleur.
  • Par exemple:

Modèle:

 
{{ my_summary(list1 + list2) }} 
... arbitrary HTML ... 
{{ my_values(list1) }} 
... arbitrary HTML ... 
{{ my_values(list2) }} 

Controller:

 
def a_controller_method(request): 
    return render_template('templatefilename', { 
     'list1': ['Dick', 'Tom', 'Harry'], 
     'list2': ['Fred', 'Barney']}) 
  • Si passer les valeurs de l'extérieur n'est pas possible, je vous suggère de les définir au haut de votre modèle, comme ceci:
 
{% set list1 = ['Dick', ...] %} 
{% set list2 = ['Fred', ...] %} 
{{ my_summary(list1 + list2) }} 
... arbitrary HTML ... 
{{ my_values(list1) }} 
... arbitrary HTML ... 
{{ my_values(list2) }} 
+0

Si je connaissais toutes les valeurs au début de la page, je n'aurais pas ce problème. Le but est de définir un modèle parent (avec my_summary()) pouvant avoir des enfants définissant my_values ​​(). Le parent n'aurait pas besoin de savoir, au début du processus de rendu, s'il le fait ou non. –

Questions connexes