Development #22878
Obtenir les exceptions lors de l'évaluation d'une condition au format Django
Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
29 mars 2018
Echéance:
% réalisé:
0%
Temps estimé:
Patch proposed:
Non
Planning:
Non
Description
Les exceptions levés par l'expression dans un {% if ..... %}
sont entièrement cachées par Django via ce code:
# django/template/smartif.py
def infix(bp, func):
"""
Creates an infix operator, given a binding power and a function that
evaluates the node
"""
class Operator(TokenBase):
lbp = bp
def led(self, left, parser):
self.first = left
self.second = parser.expression(bp)
return self
def eval(self, context):
try:
return func(context, self.first, self.second)
except Exception:
# Templates shouldn't throw exceptions when rendering. We are
# most likely to get exceptions for things like {% if foo in bar
# %} where 'bar' does not support 'in', so default to False
return False
return Operator
On souhaiterait que ce ne soit pas le cas pour permettre le même genre de log qu'avec les conditions Python.
Demandes liées
Historique
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
- Lié à Development #21545: permettre des conditions utilisant le format Django ajouté
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
Ticket Django existant: https://code.djangoproject.com/ticket/17664
Le ticket explique encore mieux les choses que je n'ai pu le faire, sia
lève une exception alors:
{% if a %}
aussi{% if a|filter %}
aussi- mais pas
{% if not a %}
- mais pas
{% if a != 3 %}
i.e. le problème n'apparait que sur une condition booléenne.
Par contre si a n'existe pas, aucune exception, VariableDoesNotExist est caché dans tous les cas et la valeur forcée à None (la condition échoue).
# django/template/defaulttags.py IfNode
def render(self, context):
for condition, nodelist in self.conditions_nodelists:
if condition is not None: # if / elif clause
try:
match = condition.eval(context)
except VariableDoesNotExist:
match = None
else: # else clause
match = True
if match:
return nodelist.render(context)
return ''
Mis à jour par Frédéric Péters il y a 4 mois
- Statut changé de Nouveau à Fermé
- Planning mis à Non
Ticket Django existant: https://code.djangoproject.com/ticket/17664
Il a depuis été rejeté sur l'idée que ça changerait trop le comportement, je vais fermer ici aussi.