Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Remplacement par defaut dans Jinja2

+2 votes

Comment fait-on pour définir le remplacement par defaut dans Jinja2?

Je m'explique. Quand jinja2 voit {{plop}} et que plop n'est pas une variable qui a été donnée par au render, il supprime {{plop}}. Je prefererai qu'il le laisse tel quel ou qu'il le templace par un string défini.
Est-ce que c'est possible à faire?

demandé 22-Oct-2015 par sPaz (306 points)

2 Réponses

+2 votes
 
Meilleure réponse

Pour faire ça de façon systématique, il faut changer l'objet Undefined utilisé par défaut dans l'environnement.

A priori, DebugUndefined convient pour ce que tu veux, sinon tu peux créer une classe fille et implémenter la méthode __unicode__.

>>> import jinja2
>>> env = jinja2.Environment(undefined=jinja2.DebugUndefined)
>>> tpl = env.from_string('hello {{world}}')
>>> tpl.render(world='monde')
u'hello monde'
>>> tpl.render()
u'hello {{ world }}'

Source dans la doc :

If a variable or attribute does not exist, you will get back an undefined value. What you can do with that kind of value depends on the application configuration: the default behavior is to evaluate to an empty string if printed or iterated over, and to fail for every other operation.

répondu 22-Oct-2015 par yoch (2,514 points)
sélectionné 23-Oct-2015 par sPaz

C'était exactement ça!
Pour modifier la forme {{var}} voila ce que j'ai fait

class MyUndefined(jinja2.Undefined):

    __slots__ = ()

    def __str__(self):
        if self._undefined_hint is None:
            if self._undefined_obj is jinja2.utils.missing:
                return u'<++ %s ++>' % self._undefined_name
            return '<++ no such element: %s[%r] ++>' % (
                object_type_repr(self._undefined_obj),
                self._undefined_name
            )
        return u'<++ undefined value printed: %s ++>' % self._undefined_hint

J'ai juste repris la classe DebugUndefined (depuis github) et j'ai adapté à mon environnement.

+1 vote

La fonction qui renvoie plop, peut tres bien renvoyer plop ou une valeur par defaut, comme ça ds la vue, plop existe toujours. Si tu tiens vraiment a le faire dans le template, ça donne un truc du genre:

from jinja2 import Template
t = '''{% set x=name or "Nsukami" %}Hello {{ name }}'''
template = Template(t)
print template.render(x='sPaz')
print template.render()
répondu 22-Oct-2015 par Nsukami_ (1,998 points)
...