2012-01-24 16 views
8

En una plantilla django, una llamada a {{ var }} fallará en silencio si var no está definido. Eso hace que las plantillas sean difíciles de depurar. ¿Existe un parámetro que pueda cambiar para que django arroje una excepción en este caso?Hacer plantillas django estrictas

La única pista en una solución que he encontrado en línea es http://groups.google.com/group/google-appengine/browse_thread/thread/86a5b12ff868038d y eso suena terriblemente hacky.

+0

Método 1 en el enlace especificado se ve bien. Dado que, las etiquetas de plantilla personalizadas son una opción legítima para ampliar la funcionalidad de la plantilla. –

Respuesta

4

Django < = 1,9

Conjunto TEMPLATE_STRING_IF_INVALID = 'DEBUG WARNING: undefined template variable [%s] not found' en su settings.py.

Ver documentos:
https://docs.djangoproject.com/en/1.9/ref/settings/#template-string-if-invalid

Django> = 1,10

Establecer opción string_if_invalid = 'DEBUG WARNING: undefined template variable [%s] not found' plantilla en el settings.py.

Ver documentos: https://docs.djangoproject.com/en/2.0/topics/templates/#module-django.template.backends.django

Lea también: http://docs.djangoproject.com/en/dev/ref/templates/api/#invalid-template-variables

+1

'TEMPLATE_STRING_IF_INVALID = '% s'' sería más apropiado ya que imprimirá el nombre de la variable que no está definido en lugar de texto aleatorio. Sin embargo, lea el recuadro de advertencia en el segundo enlace con mucho cuidado. Esto es realmente para instancias de depuración únicas, * no * algo que debe dejar todo el tiempo en desarrollo. –

+2

La configuración TEMPLATE_STRING_IF_INVALID ayudará a encontrar variables inválidas, cuando intentemos imprimirlas en una plantilla, pero si la variable se usa en una sentencia if o como la colección en for-loop, no hay ayuda para encontrarla. .. ¿Hay alguna manera de atrapar estos casos también? – Eldamir

+1

¿Hay alguna manera de generar una excepción si una variable no está definida? – utapyngo

-1

Eso es parte del diseño. Le permite proporcionar valores predeterminados y cambiar en función de si existe o no una variable en el contexto. También permite que las plantillas sean muy flexibles y promueve la reutilización de las plantillas en lugar de un enfoque estricto de "cada vista debe tener su propia plantilla".

Más al punto, las plantillas realmente no deben ser "depuradas". La idea es poner tanta lógica como sea posible fuera de la plantilla, en las vistas o modelos. Si desea averiguar por qué una variable que se supone debe pasarse al contexto no lo es, el lugar para depurar que está en su vista. Simplemente suelte import pdb;pdb.set_trace() en algún lugar antes de que su vista regrese y busque.

+1

Es código; va a necesitar depuración en algún momento. – Marcin

+0

@Marcin: estoy hablando en el sentido de la perspectiva de Django. Si confía en errores de depuración de plantillas en desarrollo para cosas que no están relacionadas con el uso indebido de una etiqueta de plantilla u otros errores simples, es probable que tenga demasiada lógica en su plantilla. –

+0

Bueno, esa es una cuestión de opinión :) ¡Pero es la 'Opinión de Django', y si es lo suficientemente importante para usted, use un motor de plantillas diferente! Lo hago, por esta razón, entre otros. – AdamKG

2

Este truco de djangosnippets generará una excepción cuando se encuentre una variable indefinida en una plantilla.

# settings.py 
class InvalidVarException(object): 
    def __mod__(self, missing): 
     try: 
      missing_str = unicode(missing) 
     except: 
      missing_str = 'Failed to create string representation' 
     raise Exception('Unknown template variable %r %s' % (missing, missing_str)) 
    def __contains__(self, search): 
     if search == '%s': 
      return True 
     return False 

TEMPLATE_DEBUG = True 
TEMPLATE_STRING_IF_INVALID = InvalidVarException() 
+0

Esto no parece detectar foobar indefinido en '{% if foobar%}' o '{% for foo in foobar%}' – azmeuk

+0

Después de la actualización desde 1.9.x> 1.10.1 obtengo: '?: (templates. E002) 'string_if_invalid' en PLANTILLAS OPCIONES debe ser una cadena pero tiene: (InvalidVarException) .' Por lo que este truco ya no funciona. – allcaps

+0

@allcaps ¿Qué sucede si lo heredas de 'basestring' o' unicode'? – utapyngo

Cuestiones relacionadas