Tutorial básico de Django. Parte 11. Error 404 not found.

Cristina Nieto Romero
2 min readJun 20, 2023

Una vista en Django es responsable de dos cosas:

  1. Devolver una respuesta satisfactoria.
  2. Devolver un error.

Si nosotros estamos consultando nuestra base de datos y esa consulta no trae nada, debemos elevar el error 404.

Vamos a Visual Studio Code al archivo views.

Y vamos a modificar la función detail, que nos ofrecía el detalle de cada pregunta:

def detail(request, question_id):
question = Question.objects.get(pk=question_id)

Esto es válido. Sin embargo, si no encontramos la pregunta vamos a tener el error does not exit.

Vamos a hacer esto de una manera más profesional que nos da Django para corregir los errores. Mediante un atajo.

Vamos a importar de django.shorcuts get_object_or_404

y en lugar de hacer Question.objects.get(pk=question_id) haremos:

def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, "polls/detail.html", {
"question": question

})

get_object_or_404: Es un atajo que nos da Django, que ejecuta por debajo Question.objects.get(pk=question_id) y si esto tiene un error Django automáticamente da el error 404.

La función get_object_or_404 cuyos parámetros serán el modelo Question a partir del cual nosotros vamos a buscar y el valor a partir del cual vamos a ejecutar internamente la función get: la primary key(pk).

Una vez obtenemos la question, guardará el valor en la variable, pero si no lo encuentra se elevará el error 404.

Retornamos render, cuyos parámetros serán:

  1. Request.
  2. El template: “polls/detail.html”.
  3. El contexto: Al ser el detalle de la pregunta le pasaremos esa misma pregunta.

Ahora que nuestra vista está lista, vamos a modificar el template: detail.html que creamos en la anterior clase.

<h1>{{ question.question_text }}</h1
<ul>
{% for choice in question.choice_set.all %}
<li{{ choice.choice_text}}</li>
{% end for%}
</ul>

Creamos un titulo cuya variable será el texto de la pregunta que nos viene por el contexto (“question”: question).

Para mostrar las respuestas de esa pregunta, creamos una unorder list y mediante un ciclo for recorremos cada respuesta del conjunto de respuestas de cada pregunta (unidas mediante la relación 1-N que definimos en la base de datos). Y dentro del for creamos un list element que va a contener una variable que será el valor de choice_text.

Ahora sí, si vamos al navegador y recargamos. Al clicar en cada pregunta podemos ver su detalle: Cada pregunta con las tres respuestas que indicamos.

--

--