2015-05-26 7 views
10

Se un modello manca nel profondo del rendering di un modello django, ottengo un'eccezione come di seguito.Messaggio di errori migliori se manca il modello

Dopo aver cercato molto tempo ho trovato la parte falsa:

{% include form.template_name %} 

form.template_name era vuota nel mio contesto.

Come posso trovare il nome del modello pertinente senza cercare ore?

Mi manca un traceback come per il normale codice Python. I traceback "normali" di python mostrano il file e la riga che contengono il bug.

/home/foo_fm_d/bin/python /usr/local/pycharm-community-4.5/helpers/pycharm/utrunner.py /home/foo_fm_d/src/foo-time/foo_time/tests/unit/views/user/test_preview_of_next_days.py::EditTestCase::test_preview_of_next_days true 
Testing started at 09:26 ... 

Error 
Traceback (most recent call last): 
    File "/home/foo_fm_d/src/foo-time/foo_time/tests/unit/views/user/test_preview_of_next_days.py", line 11, in test_preview_of_next_days 
    self.admin_client.get(url) 
    File "/home/foo_fm_d/src/djangotools/djangotools/utils/testutils.py", line 275, in get 
    response = super(Client, self).get(path, data, **extra) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/test/client.py", line 473, in get 
    response = super(Client, self).get(path, data=data, **extra) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/test/client.py", line 280, in get 
    return self.request(**r) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/test/client.py", line 444, in request 
    six.reraise(*exc_info) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 137, in get_response 
    response = response.render() 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/response.py", line 105, in render 
    self.content = self.rendered_content 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/response.py", line 82, in rendered_content 
    content = template.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 140, in render 
    return self._render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 134, in _render 
    return self.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 123, in render 
    return compiled_parent._render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 134, in _render 
    return self.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 123, in render 
    return compiled_parent._render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 134, in _render 
    return self.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 62, in render 
    result = block.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 88, in render 
    output = self.filter_expression.resolve(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 585, in resolve 
    obj = self.var.resolve(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 735, in resolve 
    value = self._resolve_lookup(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 789, in _resolve_lookup 
    current = current() 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 72, in super 
    return mark_safe(self.render(self.context)) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 62, in render 
    result = block.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 62, in render 
    result = block.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 62, in render 
    result = block.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 166, in render 
    template = get_template(template_name) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader.py", line 138, in get_template 
    template, origin = find_template(template_name) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader.py", line 131, in find_template 
    raise TemplateDoesNotExist(name) 
TemplateDoesNotExist 


Process finished with exit code 0 

Aggiornamento

personali: Fino ad ora evito di modelli Django dato che a volte eccezioni vengono silenziosamente ignorati e traceback come questo rendono il processo di debug voglia di indossare scarpe pesanti in calcestruzzo.

Cerco di liberarmi dei miei pregiudizi. O almeno trovare un modo per ottenere migliori messaggi di errore dai modelli.

Aggiornamento II

vedo la traceback tramite un unittest all'interno PyCharm. Non leggo il risultato della vista. Il client "webbrowser" chiama la vista. Ho impostato TEMPLATE_DEBUG = True, ma il risultato è lo stesso.

+0

Hai provato questo: https://docs.djangoproject.com/en/1.8/ref/settings/#template-debug? – Wtower

+0

@Wtower Vedo il traceback tramite un pyCharm interno. Non leggo il risultato della vista. Il client "webbrowser" chiama la vista. Ho impostato TEMPLATE_DEBUG = True, ma il risultato è lo stesso. – guettli

+0

Sfortunatamente 'TEMPLATE_DEBUG = True' si basa su' DEBUG = True' e quella variabile viene automaticamente impostata su 'False' quando vengono eseguiti i test. Potresti eseguire un server reale ('./manage.py runserver') e provare a riprodurlo nel browser con' TEMPLATE_DEBUG = DEBUG = True' nelle tue impostazioni? – Weier

risposta

2

Per essere onesto, ho sempre usato i meccanismi di altri manifesti suggerito con un server di vivere. Tuttavia, poiché stai cercando una soluzione che possa funzionare in Jenkins e il tuo stack mostra che stai passando attraverso debug.py, ho dato un'occhiata ai dati di debug lì.

Ho notato che il motore di template dovrebbe aggiungere uno snippet di codice sorgente per la parte in errore del modello nell'attributo django_template_source nell'eccezione.

È presente nella tua eccezione e utile? In tal caso, è possibile rilevare l'eccezione e stamparla prima di non riuscire a UT.

+0

Grazie per aver letto attentamente e compreso la mia situazione. Sviluppo applicazioni web, ma se eseguo il back-end di codice non utilizzo un browser Web, scrivo test di unità. La pagina di debug di django è ottima, ma non è visibile per test falliti. Mentre scrivo, ho una prossima idea. Forse potrei avviare lynx o w3m e scaricare l'output html della pagina di debug di django in ascii .... – guettli

+1

Yup - questo sarebbe un altro modo per metterlo in atto se puoi avviare un server di test per il tuo contenuto. Un altro pensiero: potresti dare un'occhiata a get_traceback_data in https://github.com/django/django/blob/stable/1.6.x/django/views/debug.py per ulteriori dati che potresti estrarre dall'eccezione. –

0

Come ti sembra di usare PyCharm, è possibile utilizzare il debugger, che permette di visualizzare il contesto del vostro template (luogo punti di interruzione per questo) documentation

Inoltre, la versione di Django stai usando? Nella mia (1.8 su python3.4), non c'è find_template() nel file loader.py. Potrebbe essere stato rimosso per questo motivo?

Btw, TemplateDoesNotExist sembra essere sempre chiamato con il nome del modello come param, credo per essere in grado di visualizzarlo nel messaggio di errore, ma nel tuo caso, è vuoto. Forse è un'altra ragione per cui è difficile fare il debug?

+0

Amo Python dato che si ottiene un traceback se qualcosa non va. Ma con i template di Django ottengo dei traceback come sopra. Potrei usare un debugger, ma un buon messaggio di errore alla prima esecuzione è molto importante. Se l'errore si verifica durante CI (usiamo jenkins), allora ho anche solo un traceback ASCII. Usiamo Django 1.6 (aggiorneremo presto) e Python 2.7. – guettli

+0

Uso anche il traceback come prima opzione per trovare i miei errori, poiché è molto più semplice e veloce, mantenendo il debugger per quando non è abbastanza chiaro o non fornisce abbastanza informazioni. I modelli sono a volte in questo caso. – BriceP

+0

Grazie a quel -1, non sono più autorizzato a pubblicare risposte. – BriceP

3

Il motivo per cui non si vede il solito stacktrace Python è precisamente che i modelli di Django non sono Python.

È un linguaggio specifico che è a sua volta interpretato da Python, che crea un albero di sintassi astratto basato sul modello e quindi valuta questo albero durante la fase di rendering. A questo punto, le informazioni associate all'origine (ad esempio il file modello) non sono accessibili per impostazione predefinita.

C'è un'opzione in Django per mostrare più informazioni rilevanti associate all'eccezione generata durante il rendering del modello, è TEMPLATE_DEBUG prima di DJango 1.8.

Vedi https://docs.djangoproject.com/en/1.8/ref/settings/#template-debug

Questa opzione è cambiato con Django 1.8 e l'introduzione di molteplici motori di modello, come le informazioni di debug sono specifici per ogni implementazione del motore di template.

Edit: Vedi anche What is Django's TEMPLATE_DEBUG setting for?

Problemi correlati