2012-01-24 18 views
8

In un modello di django, una chiamata a {{ var }} fallirà automaticamente se var non è definito. Ciò rende i modelli difficili da eseguire il debug. C'è un settaggio che posso cambiare in modo che django generi un'eccezione in questo caso?Rendi rigorosi i modelli di django

L'unico suggerimento per una soluzione che ho trovato online è http://groups.google.com/group/google-appengine/browse_thread/thread/86a5b12ff868038d e sembra terribilmente hacky.

+0

Il metodo 1 nel collegamento specificato sembra buono. Poiché i tag modello personalizzati sono un'opzione legittima per l'estensione delle funzionalità dei modelli. –

risposta

4

Django < = 1,9

Set TEMPLATE_STRING_IF_INVALID = 'DEBUG WARNING: undefined template variable [%s] not found' nel vostro settings.py.

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

Django> = 1,10

Impostare l'opzione string_if_invalid = 'DEBUG WARNING: undefined template variable [%s] not found' modello nella tua settings.py.

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

Leggere anche: http://docs.djangoproject.com/en/dev/ref/templates/api/#invalid-template-variables

+1

'TEMPLATE_STRING_IF_INVALID = '% s'' sarebbe più appropriato in quanto stamperà il nome della variabile che non è definito al posto di un testo casuale. Tuttavia leggi attentamente la casella di ammonizione sul secondo link. Questo è veramente per le istanze di debug una tantum, * non * qualcosa che dovresti lasciare sempre in sviluppo. –

+2

Le impostazioni TEMPLATE_STRING_IF_INVALID aiuteranno a trovare variabili non valide, quando tentiamo di stamparle in un modello, ma se la variabile viene utilizzata in un'istruzione if o come raccolta in un ciclo for, non è possibile trovare alcun aiuto. .. C'è un modo per catturare anche questi casi? – Eldamir

+1

C'è un modo per generare un'eccezione se una variabile non è definita? – utapyngo

-1

Questo è parte del disegno. Permette di fornire valori predefiniti e di cambiare in base al fatto che esista o meno una variabile nel contesto. Inoltre, consente ai modelli di essere molto flessibili e promuove la riutilizzabilità dei modelli anziché un rigoroso approccio "ogni vista deve avere il proprio modello".

Più precisamente, i modelli non dovrebbero in realtà essere "debug". L'idea è di mettere il più possibile la tua logica all'esterno del modello nelle viste o nei modelli. Se vuoi capire perché una variabile che dovrebbe essere passata al contesto non lo è, il punto di debug che è nella tua vista. Basta rilasciare import pdb;pdb.set_trace() da qualche parte prima che la vista ritorni e curiosare.

+1

È il codice; avrà bisogno di eseguire il debug ad un certo punto. – Marcin

+0

@Marcin: sto parlando nel senso della prospettiva di Django. Se ti affidi a errori di debug del template nello sviluppo per cose non correlate a manipolare un templatetag o altri semplici errori, probabilmente hai troppa logica nel tuo template. –

+0

Beh, questa è una questione di opinione :) Ma è l'opinione di Django, e se ti sembra abbastanza, usa un motore di template diverso! Lo faccio, per questo motivo, tra gli altri. – AdamKG

2

Questa modifica da djangosnippets genererà un'eccezione quando si incontra una variabile non definita in un modello.

# 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

Questo non sembra rilevare fobar non definito in '{% if foobar%}' o '{% for foo in foobar%}' – azmeuk

+0

Dopo l'aggiornamento da 1.9.x> 1.10.1 ottengo: '?: (modelli. E002) 'string_if_invalid' in TEMPLATES OPTIONS deve essere una stringa ma ottenuto: (InvalidVarException) .' Quindi questo hack non funziona più. – allcaps

+0

@allcaps cosa succede se si eredita da 'basestring' o' unicode'? – utapyngo