2013-03-09 9 views
22

Sto usando i template Django in un progetto non-Django e voglio assicurarmi che i miei template non contengano riferimenti a variabili che non sono nel contesto e per questo ho bisogno di renderer template Django per generare un errore quando vede {{ non_existent_variable }} quando non c'è lo non_existent_variable in Context.Come far sorgere un errore nel template Django se manca una variabile nel contesto

TEMPLATE_STRING_IF_INVALID potrebbe essere impostato su qualcosa e quindi potremmo verificare che questo qualcosa non sia nel modello renderizzato, ma che non è affatto elegante.

Posso in qualche modo senza troppo lavoro ignorare il modo in cui il contesto ingoia gli errori dei tasti mancanti?

+1

http://djangosnippets.org/snippets/646/ – catherine

+0

non vedo un motivo valido per utilizzare il motore di template Django al di fuori di un progetto Django . Il motore di template Django è stato progettato per essere "web-designer-proof", e questo comportamento è solo uno dei compromessi realizzati. Hai sentito parlare di Jinja2? –

+0

Grazie a @catherine! Funziona. – jbasko

risposta

20

C'è una Django Snippet che fornisce una soluzione:

# 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

Ciò è utile ma non rileverà una variabile mancante in '{% if not i_do_not_exist%}'. C'è una soluzione? – Medorator

+2

Questo è grandioso, grazie. Nota che in Django 1.8+, devi invece impostare 'OPTIONS ['debug']' e 'OPTIONS ['string_if_invalid']'. Ma c'è un modo per farlo funzionare negli scenari 'missing_var | default:" foo "'? Sembra che questo sollevi prima che "default" abbia la possibilità di fare la cosa. –

+0

Ho provato questa soluzione con Django 1.11, usando 'string_if_invalid', e ho ricevuto questo errore durante l'esecuzione del server:'?: (Templates.E002) 'string_if_invalid' in TEMPLATES OPTIONS deve essere una stringa ma ha ottenuto: (InvalidVarException) .' –

Problemi correlati