2012-08-17 4 views
5

En django, nous pouvons le faire:Pylônes Mako comment vérifier si elles existent variables ou non

views.py : 

    def A(request): 
     context = {test : 'test'} 
     return render_to_response('index.html', context , context_instance = RequestContext(request)) 

    def B(request): 
     context = {} 
     return render_to_response('index.html', context , context_instance = RequestContext(request)) 

index.html: 

     {% if test %} 
      {{ test }} 
     {% endif %} 

Et que notre modèle rend sans erreur, même si je l'utilise method B, où 'test' variable n'existe pas, mais Je peux toujours le mettre dans le gabarit.

Je veux faire la même chose avec pylones + mako, dans le contrôleur:

foo.py 

    def A(self): 
     c.test = 'test' 
     return render('index.html') 

    def B(self): 
     return render('index.html') 

index.html : 

     % if c.test: 
      ${'c.test'} 
     % endif 

Dans Django, je peux le faire, mais dans Pylônes, je reçois une erreur, est de toute façon de vérifier wheter 'c.test' existe ou pas?

l'erreur: AttributeError: objet 'ContextObj' n'a pas d'attribut 'test'

Répondre

4

De l'mako Docs on Context Variables:

% if someval is UNDEFINED: 
    someval is: no value 
% else: 
    someval is: ${someval} 
% endif 

Les documents décrivent cela comme référence des noms de variables non dans le contexte actuel. Mako définira ces variables à la valeur UNDEFINED.

Je vérifie les variables comme ceci:

% if not someval is UNDEFINED: 
    (safe to use someval) 

Cependant, si Pylônes/pyramide a mise en strict_undefined=True, les tentatives d'utiliser les résultats variables non définies dans un NameError être élevé. Ils donnent une brève justification philisophique pour le faire de cette façon, au lieu de simplement remplacer les variables non définies par des chaînes vides qui semblent cohérentes avec la philosophie Python. Cela m'a pris un peu de temps pour le trouver, mais la lecture de l'intégralité de section on the Mako Runtime éclaircira la façon dont Mako reçoit, définit et utilise les variables de contexte.

Modifier:
Pour l'amour de complétions, les documents expliquent la strict_undefined mise here. Vous pouvez modifier cette variable en dans l'un de vos fichiers .ini:

[app:main] 
... 
mako.strict_undefined = false 
+0

merci, juste une autre question, donc si je ne suis pas sûr que certaines variables existent ou non, n'utilisez pas strict_undefined = True? – Santana

+0

Non, je pense que l'emballage dans un bloc try/except marcherait toujours dans ce cas. Je m'en remettrais à quelqu'un de plus expérimenté, mais je soupçonne qu'il s'agit plutôt de garder un style de codage cohérent. Je ne suis pas sûr de le faire d'une manière sur l'autre est «plus correct». – chris

+1

J'ai ajouté une réponse qui ne dépend pas de strict_undefined –

0

un peu en retard, donc chaque fois que vous utilisez une variable sur votre modèle qui n'existe pas sur votre contrôleur, pylones déclenche une erreur , pour désactiver l'erreur, il suffit de mettre dans votre environment.py:

config['pylons.strict_tmpl_context'] = False 
6

J'ai eu un problème similaire où j'ai eu plusieurs vues en utilisant le même modèle et nécessaires pour tester si une variable a été définie. J'ai regardé les documents chris référencés et trouvé une autre façon de résoudre ce problème indépendamment de la façon dont mako.strict_undefined est définie. Essentiellement, vous appelez la méthode get() sur l'objet context. Dans votre exemple, vous pouvez effectuer les opérations suivantes:

% if context.get('test', UNDEFINED) is not UNDEFINED: 
    ${test} 
% endif 

ou

${context.get('test', '')} 

qui imprimera les mêmes que ${test} si elle existe, et imprimer une chaîne vide si elle ne fonctionne pas.

Malheureusement, vous ne pouvez pas sembler utiliser un opérateur in sur context qui serait le plus intuitif.

Questions connexes