Projet

Général

Profil

Bug #45390

foo|add:bar plante si bar n'existe pas

Ajouté par Thomas Noël il y a plus de 3 ans. Mis à jour il y a plus de 3 ans.

Statut:
Nouveau
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
23 juillet 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

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

#1

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.

#2

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.

#3

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

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

#4

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.

#5

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.

Formats disponibles : Atom PDF