Bienvenue sur IndexError.

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

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

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)
...