Projet

Général

Profil

Development #22878

Obtenir les exceptions lors de l'évaluation d'une condition au format Django

Ajouté par Benjamin Dauvergne il y a environ 6 ans. Mis à jour il y a 4 mois.

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

Lié à w.c.s. - Development #21545: permettre des conditions utilisant le format DjangoFermé31 janvier 2018

Actions

Historique

#1

Mis à jour par Benjamin Dauvergne il y a environ 6 ans

#2

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, si a 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 ''
#3

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.

Formats disponibles : Atom PDF