Bug #45390
foo|add:bar plante si bar n'existe pas
0%
Description
En cherchant à évaluer {{ foo|add:bar }} on arrive sur TemplateError: impossibilité de faire le rendu du gabarit Django : Failed lookup for key [bar] in '[{\'True\': True, \'False\': ....
Il faudrait dans ce cas considérer que bar est None ou 0
Historique
Mis à jour par Thomas Noël il y a plus de 3 ans
En fait je pense qu'on ne peut rien faire : c'est natif dans Django de rechercher la valeur de droite dans le contexte.
Mis à jour par Paul Marillonnet il y a plus de 3 ans
Thomas Noël a écrit :
En fait je pense qu'on ne peut rien faire : c'est natif dans Django de rechercher la valeur de droite dans le contexte.
Non, c'est une lacune de notre côté il me semble. Dans w.c.s. on essaie de tout faire en se basant sur django.template.base.Variable
, même les expressions avec filtre.
Dans Django natif c'est fait dans une classe à part, django.template.base.FilterExpression
, dont la méthode resolve
attrape les erreurs VariableDoesNotExist
et poursuit son exécution en conséquence, notamment en tentant une substitution de l'expression par l'option de configuration du moteur de rendu string_if_invalid.
Mis à jour par Paul Marillonnet il y a plus de 3 ans
Paul Marillonnet a écrit :
Thomas Noël a écrit :
En fait je pense qu'on ne peut rien faire : c'est natif dans Django de rechercher la valeur de droite dans le contexte.
Non, c'est une lacune de notre côté il me semble. Dans w.c.s. on essaie de tout faire en se basant sur
django.template.base.Variable
, même les expressions avec filtre.
Dans Django natif c'est fait dans une classe à part,django.template.base.FilterExpression
, dont la méthoderesolve
attrape les erreursVariableDoesNotExist
et poursuit son exécution en conséquence, notamment en tentant une substitution de l'expression par l'option de configuration du moteur de rendu string_if_invalid.
Et non, analyse trop rapide. La levée d'erreur semble en fait tout à fait délibérée, c'est même ici précisément, le raises=True
: https://git.entrouvert.org/wcs.git/tree/wcs/qommon/form.py#n2537
Mis à jour par Thomas Noël il y a plus de 3 ans
en Django "natif" :
>>> from django.template import Template, Context >>> Template('{{ foo|add:bar }}').render(Context({})) ... VariableDoesNotExist: Failed lookup for key [bar] in "[{'True': True, 'False': False, 'None': None}, {}]"
C'est avant l'exécution du filtre que bar est recherchée (pour appeler le filtre) et VariableDoesNotExist provoque un crash avant même l'entrée dans le filtre donc.
Je ne vois pas de solution évidente.
Mis à jour par Paul Marillonnet il y a plus de 3 ans
Thomas Noël a écrit :
Je ne vois pas de solution évidente.
Ok, à vue de nez en changeant la valeur du raises
pour False
dans l'appel au rendu de gabarit dans w.c.s. alors l'expression entière serait remplacée par la chaîne de substitution en cas d'invalidité. Mais ce n'est clairement pas l'objet du ticket, i.e. que l'expression soit correctement évaluée avec bar
à 0.