No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso Básico de Django

Curso Básico de Django

Facundo García Martoni

Facundo García Martoni

Creando el template del home

21/29
Recursos

Aportes 14

Preguntas 1

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

El motor de templates usa {% %} para todo lo que son bloques, ya sean operaciones como condicionales, ciclos o bloques personalizados que se utilizan para heredar datos entre templates y {{ }} se usa para las variables.

El render es una función importada de Django. Necesita tres parámetros

  • El request
  • La ubicación de la template correlacionada. En la ruta se omite la carpeta /template/ ya que Django junta todas las carpetas templates de todas las aplicaciones de nuestro proyecto y las hace una sola
  • Un objeto con la o las variables que le estaremos pasando a nuestra template

Docstring: Es importante en cada view tener la documentación de que realiza cada función

    """[polls/views/index]
    Args:
        request ([HTTP]): [Request]
    Returns:
        [Render]: [Request, Url, Dict(Question.objects.all())]
    """

Django, al igual que FastAPI y Flask usan un lenguaje de templates llamado Jinja( la sintaxis {%%}, {{}}, etc, que menciona), aquí les dejo la documentación completa.

Se refiere a herencia a algo asi
{% block header %}
{% include ‘header.html’ %}
{% endblock %}
{% block navbar %}
{% include ‘navbar.html’ %}
{% endblock %}
tiene un header y un navbar creados y tan solo los llama para no repetirlos en el resto de paginas

En un principio me parecio un poco confuso, pero me doy cuenta que se puede tener un control bastante preciso de las rutas que se pueden tener en Django y me parece una excelente herramienta

El tag for permite evaluar directamente que hacer si el queryset viene vacío usando la expresión empty antes de finalizar

Elementos a tener en cuenta en el lenguaje de plantillas son los tags, y los filters, que nos permiten agregar algo más de funcionalidad a nuestra app

Creando el template del home

Conectamos a los templates con las views:

index. html:

{% if latest_question_list %}
<ul>
  {% for question in latest_question_list %}
  <li><a href="/polls/{{ question.id }}">{{ question.question_text }}</a></li>
  {% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}

views. py:

from django.shortcuts import render
from django.http import HttpResponse

from .models import Question


def index(request):
    latest_question_list = Question.objects.all()
    return render(request, "polls/index.html", {
        # * La variable ahora está disponible en index.html
        "latest_question_list": latest_question_list
    })

Por si no les funciona como en el vídeo pueden poner de la siguiente manera: creando una variable context que sea igual al diccionario y esa variable se pasa en la funcion render

def index(request):
    latest_question_list = Question.objects.all()
    context = {"latest_question_list": latest_question_list}
    return render(request, 'polls/index.html', context)

https://docs.djangoproject.com/en/4.0/intro/tutorial03/

Sí salió mi template!

Every View can be linked to a Template to be seen at the frontend

At polls we create a templates folder and inside a polls folder, this a good practices to keep in order the structure of our project with the same logic we are working on with Django.

Django template system

Django extension for vscode is recommended

also we have to update the vscode settings.json (ctrl+ p / ctrl + ,) to get the autocomplete feature

"emmet.includeLanguages":{
        "django-html": "html"
    } 


Next, we will create a templates/polls/index.html for the index template

{% if latest_question_list %}
    <ul>
        {% for question in latest_question_list %}
            <li><a href="/polls/{{ question.id }}">{{ question.question_text }}</a> </li>
        {% endfor %}
    </ul>
{% else %}
    <p>No polls are available 😓.</p>
{% endif %}


Also, we need to update our polls/views.py to connect with the template.

from django.shortcuts import render
from django.http import HttpResponse
from .models import Question

#function based view
#every function works with requests and http response 
def index(request):
    """our index page view"""
    latest_question_list = Question.objects.all()
    return render(request, "polls/index.html",{
        "latest_question_list":latest_question_list
        })

def detail(request, question_id):
    """details of the question"""
    return HttpResponse(f'Estás viendo la pregunta {question_id}')

def results(request, question_id):
    """details of every question result"""
    return HttpResponse(f'Estás viendo los resultados de la pregunta {question_id}')

def vote(request, question_id):
    """Functions for voting confirmation"""
    return HttpResponse(f'Estás votando a la pregunta {question_id}')


Notices two important things:

  • latest_question_list is a query as we learned at the interactive shell classes
  • render use the same django structure to find the template, that’s the importances of our order.

si cambias ul por ol te aparecerán las preguntas numeradas tipo:
1.¿Cual es el mejor curso de Platzi?
2.¿Quién es el mejor profesor de Platzi?
3.¿Cuál es la mejor escuela de Platzi?

El atributo href en la etiqueta <a>
Su valor va de esta manera: Sin el ** polls/ **

<li><a href="{{ question.id }}">{{ question.question_text }}</a> </li>

Porque ya estamos en path ** polls/ **

Sino crearía conflictos el path de la functions ** detail() ** al darle click al hiper vinculo de las pregunta renderisadas en este template.

Nunca paren de aprender 😉
Buenas noches colegas 😉