Lever une exception ou enregistrer lorsqu'une variable de modèle Django n'est pas valide

Le moteur de template de django est tolérant, donc appeler des fonctions ou des variables qui n'existent pas sur un objet ne fera aucune exception. Dans ce cas, au lieu d'une exception, un caractère vide est affecté pour le rendre.

C'est beaucoup de comportement qui est apprécié dans un environnement de production, mais c'est aussi agréable d'avoir une erreur dans un environnement de développement. De plus, même dans un environnement de production, il devrait être possible de se connecter même si cela ne provoque pas d'erreur.

Jusqu'à django1.8, cela fonctionnait avec la méthode suivante, mais après cela, la méthode de réglage a changé. stackoverflow.com:show-undefined-variable-errors-in-django-templates

Vous pouvez maintenant définir la valeur sur TEMPLATES.OPTIONS.string_if_invalid dans settings.py. docs.djangoproject.com:How invalid variables are handled

Ici, spécifiez "Quoi afficher lors de l'accès à une variable modèle inexistante". Fondamentalement, il est prévu de définir une chaîne de caractères, et si vous entrez % s, vous pouvez voir le" nom de variable accédé (inexistant) ".

Si vous définissez ici les paramètres suivants, vous pourrez définir le comportement de "lors de l'accès à une variable modèle inexistante".

settings.py

class InvalidString(str):
    # "%s is ok" % undefined  :Pour les opérations de format de chaîne__mod__Est appelé
    def __mod__(self, other):
        msg = "Undefined variable or unknown value for: %s" % other
        if TEST or IS_LOCAL:
            #Exception pour l'environnement de développement
            from django.template.base import TemplateSyntaxError
            raise TemplateSyntaxError(msg)
        else:
            #Sortie de journal si cela ressemble à la production
            import logging
            logger = logging.getLogger('strange')
            logger.info(msg)


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
            ],
            'string_if_invalid': InvalidString("%s"),  #Définir ici
        },
    },
]

__mod__ est généralement de type int et est l'endroit où vous écrivez le comportement lorsque le reste est demandé. Si vous définissez quelque chose comme une chaîne de caractères, elle sera appelée lors d'une opération de formatage de chaîne de caractères. Dans ce cas, le nom de la variable qui a été accédé mais qui n'existe pas est entré et appelé.

Recommended Posts

Lever une exception ou enregistrer lorsqu'une variable de modèle Django n'est pas valide
[Django] Mémo lorsque le journal n'était pas
Un programme qui détermine automatiquement s'il s'agit d'une animation ou d'une photo lorsque vous entrez l'image d'une personne [python]