Die Template-Engine von django ist tolerant, sodass das Aufrufen von Funktionen oder Variablen, die für ein Objekt nicht vorhanden sind, keine Ausnahme darstellt. In einem solchen Fall wird anstelle einer Ausnahme ein leeres Zeichen zum Rendern zugewiesen.
Dies ist eine Menge Verhalten, das in einer Produktionsumgebung geschätzt wird, aber es ist auch schön, einen Fehler in einer Entwicklungsumgebung zu haben. Auch in einer Produktionsumgebung sollte es möglich sein, zu protokollieren, auch wenn dies keinen Fehler verursacht.
Bis django1.8 funktionierte es mit der folgenden Methode, danach hat sich die Einstellungsmethode geändert. stackoverflow.com:show-undefined-variable-errors-in-django-templates
Sie können jetzt in settings.py einen Wert für TEMPLATES.OPTIONS.string_if_invalid
festlegen.
docs.djangoproject.com:How invalid variables are handled
Geben Sie hier "Was beim Zugriff auf eine nicht vorhandene Vorlagenvariable angezeigt werden soll" an. Grundsätzlich wird erwartet, dass eine Zeichenfolge festgelegt wird. Wenn Sie "% s" eingeben, wird der "Name der zugegriffenen (nicht vorhandenen) Variablen" angezeigt.
Wenn Sie hier die folgenden Einstellungen vornehmen, können Sie das Verhalten von "beim Zugriff auf eine nicht vorhandene Vorlagenvariable" definieren.
settings.py
class InvalidString(str):
# "%s is ok" % undefined :Für Zeichenfolgenformatoperationen__mod__Wird genannt
def __mod__(self, other):
msg = "Undefined variable or unknown value for: %s" % other
if TEST or IS_LOCAL:
#Ausnahme für Entwicklungsumgebung
from django.template.base import TemplateSyntaxError
raise TemplateSyntaxError(msg)
else:
#Protokollausgabe, wenn es nach Produktion aussieht
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"), #Hier einstellen
},
},
]
__mod__
ist normalerweise int-like und schreibt das Verhalten, wenn der Rest berechnet wird.
Wenn Sie so etwas wie eine Zeichenfolge definieren, wird diese während der Zeichenfolgenformatierung aufgerufen.
In diesem Fall wird der Variablenname eingegeben und aufgerufen, auf den zugegriffen wurde, der jedoch nicht vorhanden ist.