2011-05-08 11 views
9

que tiene un sitio web donde algunas páginas se editan con la mano. Cuando falta una de esas plantillas, simplemente significa que la página no está presente, por lo que me gustaría mostrar un error 404.pantalla Django 404 en la plantilla que falta

En su lugar recibo una excepción TemplateDoesNotExist.

¿Hay una manera de decirle a Django para que aparezca un error 404 cuando no encuentra una plantilla?

Respuesta

12

Si desea este comportamiento para todos los puntos de vista sobre su sitio, Es posible que desee escribir su propio middleware con un método process_exception.

from django.template import TemplateDoesNotExist 
from django.views.defaults import page_not_found 

class TemplateDoesNotExistMiddleware(object): 
    """ 
    If this is enabled, the middleware will catch 
    TemplateDoesNotExist exceptions, and return a 404 
    response. 
    """ 

    def process_exception(self, request, exception): 
     if isinstance(exception, TemplateDoesNotExist): 
      return page_not_found(request) 

Si ha definido su propio handler404 que se necesita para reemplazar page_not_found anteriormente. No estoy seguro de inmediato cómo se puede convertir la cadena en el handler404 exigible requerida en el middleware ..

para permitir que su middleware, añadirlo a MIDDLEWARE_CLASSES en settings.py. Tenga cuidado con la posición donde lo agrega. Se aplica la advertencia estándar de middleware Django:

De nuevo, el middleware se ejecuta en orden inverso durante la fase de respuesta, que incluye process_exception. Si un middleware de excepción devuelve una respuesta, las clases de middleware sobre ese middleware no se llamarán en absoluto.

9

poner el retorno de la respuesta en la vista (o dondequiera que la plantilla se representa) en un intento-a excepción del bloque:

from django.http import Http404 
from django.shortcuts import render_to_response 
from django.template import TemplateDoesNotExist 

def the_view(request): 
    ... 
    try: 
     return render_to_response(...) 
    except TemplateDoesNotExist: 
     raise Http404 
+0

necesidad de importar la excepción: 'TemplateDoesNotExist' de importación django.template. –

+0

Gracias por la adición. Olvidé de dónde importar la excepción, ya que no pude verificar. Editado la respuesta. –

+0

Sí, sé que puedo hacer esto, pero se convierte en un estándar en todos los puntos de vista. Esperaba que hubiera una manera global de hacer esto. – Andrea

-1

Fuera de la cabeza, pero si establece DEBUG = False en su configuración, ¿no obtendrá 404 entonces en cada error (incluyendo TemplateNotFound)?

+0

Creo que sí, pero necesito esto para probarlo. – Andrea

+2

Esta respuesta es incorrecta. Para errores el comportamiento predeterminado de Django es ejecutar la vista 'server_error', hará que el' 500.html' plantilla y volver a una página con código de error 500. Ver http://docs.djangoproject.com/en/dev/topics/ http/views/# the-500-server-error-view – Alasdair