2010-07-14 16 views

Respuesta

10

La get_object_or_404() es básicamente una función simple de 5 líneas. A menos que tenga alguna razón específica para usarlo, simplemente hacer:

try: 
    instance = YourModel.objects.get(pk=something) 
except YourModel.DoesNotExist: 
    return render_to_response('a_template_with_your_error_message.html') 

Si por cualquier razón usted tiene utilizar get_object_or_404(), puede intentar ponerlo en un bloque try: ... except Http404: ..., pero sinceramente no puede piensa en una razón plausible para eso.

0

Eso no se puede hacer con ese atajo. Solo puede generar una excepción Http404. Tu mejor opción es intentar atrapar si quieres un control total. P.ej.

try: 
    obj = Model.objects.get(pk = foo) 
except: 
    return HttpResponseRedirect('/no/foo/for/you') 
    #or 
    return render_to_response ... 
1

¿Y por qué exactamente no estás usando la capacidad de tu servidor para hacer exactamente eso?
get_object_or_404() está redirigiendo a la página predeterminada 404 ¿verdad?
Si está en modo de depuración no lo verá, pero cuando lo despliegue django solo se referirá a la página de 404 html del servidor.

1

Según lo indicado por michael, al usar get_object_or_404 no puede personalizar el mensaje dado en http 404. El mensaje proporcionado en DEBUG ofrece información sobre la excepción: "Ningún MyModel coincide con la consulta dada".

Mira el doc en esto. Hay tres argumentos: Modelo, * args y ** kwargs. Los dos últimos se usan para construir un argumento para get() o filter() en el Modelo.

La razón que escribí, sin embargo, es abordar la pregunta de por qué querríamos usar una función auxiliar como get_object_or_404() en lugar de, por ejemplo, atraparla con una excepción como Model.DoesNotExist.

La solución posterior acopla la capa de vista a la capa del modelo. En un esfuerzo por relajar este acoplamiento, podemos aprovechar el acoplamiento controlado que se ofrece en el módulo django.shortcuts [1].

Cuestiones relacionadas