Tutorial básico de Django. Parte 11. Error 404 not found.
Una vista en Django es responsable de dos cosas:
- Devolver una respuesta satisfactoria.
- 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:
- Request.
- El template: “polls/detail.html”.
- 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.