Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso Básico de Django

Curso Básico de Django

Facundo García Martoni

Facundo García Martoni

Elevando el error 404

22/29
Recursos

Aportes 11

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Personalizar Error 404 puedes hacer lo siguiente:

En settings,py debes modificar lo siguiente:

DEBUG = False
ALLOWED_HOSTS = ['*']

Y el archivo debe ir dentro de polls/templates/404,html

Esta muy interesante la manera de hacer consultas

Http Status Code:

Este es un tema muy interesante acerca de los shortcut functions de Django, en este documento cortico encontrarán toda la información valiosa para entender el funcionamiento más a profundidad, espero sea de ayuda.

Allí se tratan 4 puntos importantes:

  • render()
  • redirect()
  • get_object_or_404()
  • get_list_or_404()

Documentación: Django shortcut functions

La forma de hacerlo sin el shorcut podria ser así:

from django.http import Http404
def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404()

Aclaracion:
Este approach funciona cuando tenemos definido un template espacifico para errores 404 (404.html), si DEBUG=False en el config. py entonces Django va a mostrar este template cada vez que elevemos el error asi como lo hice yo. Tambien puedes hacerlo de la siguiente manera

return HttpResponseNotFound('<h1> not found </h1>')

de esta forma puedes definir el html a retrnar directamente en la response.

Mas detalles en la doc de Django

La verdad que Django es una delicia para programar, tiene la simplicidad de Python para programar y entender el código. Pero a su vez un montón de funcionalidades de una comunidad tan activa y con lo cual puedes hacer casi todo. Me encanta este framework es lo que estaba buscando para mis herramientas de desarrollo.

si no hay respuesta, salta un comentario "no hay

{% if question.choice_set.all %}
    <h1>{{question.question_text}}</h1>
        <ul>
    {% for choice in question.choice_set.all %}
        <li>{{choice.Choices_text}}</li>
    {% endfor %}
        </ul> 
{% else %}
    <p> <h1>{{question.question_text}}</h1></p>
    <p> no hay</p>
{% endif %}

"

Si no encuentra respuestas simplemente se pone una condicion:

<h1>{{question.question_text}}</h1>
<ul>
    {% if question.question_choices.all %}
        {% for choice in question.question_choices.all %}
            <li>{{choice.choice_text}}</li>
        {% endfor %}
    {% else %}
        <p>No choices for this question</p>
    {% endif %}
    
</ul> 

Tipar los parámetros ayuda al autocompletado 😄

from django.http import HttpRequest

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

En los templates no se le colocan los () al queryset
Porque así es la sintaxis de django para hacer los templates.

Se puede hacer el queryset desde la vista si se desea:

question = Question.objects.get(pk=question_id)
choices = question.choice_set.all()

O como lo hizo el profesor desde el template:

{% for choice in question.choice_set.all %}

Permitiendo Minimixar lineas de código.
Aunque no lo quería, a medida que avanzo en aprendizaje busco la manera de escribir menos lineas posibles.

Nunca pares de aprender.
Exitos codeando 😉