lunes, 12 de diciembre de 2022

3.- Django - Plantillas II, variables y propiedades en la plantilla.

En el apartado anterior vimos como crear y cargar plantillas desde las vistas. En este apartado vamos a profundizar más y veremos como pasar información a las plantillas, para lo cual utilizaremos un tipo de dato de Python, como son los diccionarios dentro de los contextos.

Seguimos con el mismo ejemplo usado en el capitulo anterior donde una de la vistas se llamaba "saludo" y cargábamos un documento externo, la plantilla, desde un directorio creado al efecto.

Imaginemos que queremos pasarle un nombre de usuario a la plantilla desde la vista para que la muestre en la página web y le de la Bienvenida.

Por ejemplo que Ponga "Bienvenido Pedro" o lo que tu quieras.

Empezamos creando en las vistas, views.py, una variable "nombre" que recoja el nombre que le queramos pasar. Luego dentro del contexto y siempre a través de un diccionario usamos una clave "nombre_usuario" cuyo valor será renderizado posteriormente al mostrar la página web.

views.py: archivos de vistas.

...
# Vistas
def saludo(request):
    doc_externo = open("/home/chema/Cursos/DJANGO/Proyecto1/plantillas/plantilla.html")
    plantilla = Template(doc_externo.read())
    doc_externo.close()

    nombre = "Antonio"

    # Al contexto hay que pasarle un diccionario que se usara para transferir a el valor
    # a la plantilla
    contexto = Context({"nombre_usuario": nombre})
    documento = plantilla.render(contexto)
    return HttpResponse(documento)

...

Para finalizar en la plantilla, ponemos donde queramos que se renderice posteriormente esta información usando flechas dobles {{ }}. Tiene su lógica puesto que recuerda que en Python se usan las flechas sencillas para crear los diccionarios {}.

plantilla.html

<!DOCTYPE html>
<html lang="es">
<head>
     <meta charset="UTF-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Fecha Servidor</title>
</head>
<body>
      <h3>
         ¡Hola Mundo! He sido cargado desde una plantilla.         
      </h3> 
      <p>
            Bienvenido {{nombre_usuario}}
      </p>  
</body>
</html>


Salida:


variable renderizada en la plantilla

Podemos pasar tantas claves como queramos e incluso usar la metodología del punto de las clases para pasar valores. Por ejemplo aprovechando que habíamos importado la función "datetime" vamos a mostrar la fecha actual del siguiente modo:

views.py: archivos de vistas.

...
# Vistas
def saludo(request):
    doc_externo = open("/home/chema/Cursos/DJANGO/Proyecto1/plantillas/plantilla.html")
    plantilla = Template(doc_externo.read())
    doc_externo.close()

    nombre = "Antonio"
    fecha_actual = datetime.datetime.now()

    # Al contexto hay que pasarle un diccionario que se usara para transferir a el valor
    # a la plantilla
    contexto = Context({"nombre_usuario": nombre, "date": fecha_actual})
    documento = plantilla.render(contexto)
    return HttpResponse(documento)

...
y modificamos la plantilla:

plantilla.html

<!DOCTYPE html>
<html lang="es">
<head>
     <meta charset="UTF-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Fecha Servidor</title>
</head>
<body>
      <h3>
         ¡Hola Mundo! He sido cargado desde una plantilla.         
      </h3> 
      <p>
            Bienvenido {{nombre_usuario}}
      </p>  
      <p>
            Hoy es {{date.day}} - {{date.month}} - {{date.year}}
      </p>
</body>
</html>

Salida:


inclusión de variable en plantillas


A continuación vamos a ver como pasar una lista a una plantilla. Seguimos con el ejemplo y vamos a pasarle una lista con ciudades.

El proceso es igual que en los casos anteriores. Creamos la lista y se la pasamos a través del contexto mediante un diccionario que contendrá la clave "lugares" y como valor la lista a pasar.

views.py: archivos de vistas.

...
# Vistas
def saludo(request):
    doc_externo = open("/home/chema/Cursos/DJANGO/Proyecto1/plantillas/plantilla.html")
    plantilla = Template(doc_externo.read())
    doc_externo.close()

    nombre = "Antonio"
    fecha_actual = datetime.datetime.now()

    ciudades = ["Barcelona", "Madrid", "León", "Caceres"]

    # Al contexto hay que pasarle un diccionario que se usara para transferir a el valor
    # a la plantilla
    contexto = Context({"nombre_usuario": nombre, "date": fecha_actual, "lugares":ciudades})
    documento = plantilla.render(contexto)
    return HttpResponse(documento)

...

y modificamos la plantilla para que sean mostrados. La lista se muestra tal cual.

plantilla.html

...
<body>
      <h3>
         ¡Hola Mundo! He sido cargado desde una plantilla.         
      </h3> 
      <p>
            Bienvenido {{nombre_usuario}}
      </p>  
      <p>
            Hoy es {{date.day}} - {{date.month}} - {{date.year}}
      </p>
      <p> En todas estas ciudades:
            <br/><br/>
            {{lugares}}
      </p>
</body>
...

Salida:

Insertar una lista en una plantilla

¿Y si quisieramos acceder a un solo elementos de la lista? Pues lo hariamos directamente en la plantilla con la nomenclatura del punto. En el ejemplo si solo quisiéramos mostrar "Caceres" (las listas en python comienzan en el elemento 0) el código sería:

plantilla.html

...
<body>
      <h3>
         ¡Hola Mundo! He sido cargado desde una plantilla.         
      </h3> 
      <p>
            Bienvenido {{nombre_usuario}}
      </p>  
      <p>
            Hoy es {{date.day}} - {{date.month}} - {{date.year}}
      </p>
      <p> En todas estas ciudades:
            <br/><br/>
            {{lugares.3}}
      </p>
</body>
...

También podríamos haberlo hecho mediante Python en el archivo de vistas y pasarle solo el elemento que nos interese.


Salida:

Seleccionando un elemento de una lista

En los ejemplos anteriores hemos utilizado varias veces la nomenclatura del punto. Vamos a hacer un inciso para ver el orden jerárquico que usa Django cuando se encuentra con un punto. Es decir que hace Django cuando encuentra un punto en un plantilla. En este orden:

- Lo primero que hace es buscar un Diccionario. Es decir a ver si ese punto corresponde con un elemento de un diccionario.

- Si no lo encuentra mira a ver si ese mismo punto corresponde a un Atributo o Propiedad correspondiente a una clase.

- En tercer lugar pasa a mirar si se trata de un Método perteneciente a un objeto o una clase.

- Y por último mira a ver si es un elemento de una Lista (como en el ejemplo previo)


Bucles en plantillas de Django.

¿y si quisiéramos que las ciudades aparezcan una debajo de otra? Pues se puede hacer de varias formas pero para avanzar un poco vamos a usar los bucles en plantillas con Django.

Los bucles en plantillas van, NO entre dos llaves, si no entre una llave simple y utilizando el signo de porcentaje. Hay que poner una etiqueta de apertura del bucle y otra de cierre. Al igual que en Python se usa la palabra reservada "for" de la siguiente forma:

plantilla.html

...
<body>
      <h3>
         ¡Hola Mundo! He sido cargado desde una plantilla.         
      </h3> 
      <p>
            Bienvenido {{nombre_usuario}}
      </p>  
      <p>
            Hoy es {{date.day}} - {{date.month}} - {{date.year}}
      </p>
      <p> En todas estas ciudades:</p>
      <p>
            <ul>
            {% for ciudad in lugares %} <!-- Llave de apertura -->
                  <li>{{ciudad}}</li>
            {% endfor %} <!-- LLave de cierre -->
            </ul>
      </p>
</body>
...

Salida:

bucle for en Django


Condicionales.

Al igual que cualquier lenguaje de programación también podemos usar condicionales. Se construye de la misma forma que hemos visto antes para los bucles, con una etiqueta de apertura y otra de cierre y usando una llave y la palabra reservada "if". Por ejemplo vamos a modificar la plantilla para que nos indique si estamos en la primera quincena del mes o en la segunda.

La sintaxis sería la siguiente:

plantilla.html

...
      <p>
            Bienvenido {{nombre_usuario}}
      </p>  
      <p>
            Hoy es {{date.day}} - {{date.month}} - {{date.year}}.
            {% if date.day < 15 %}
                  Estamos en la primera quincena del mes.
            {% else %}
                  Estamos en la segunda quincena del mes.
            {% endif %}
      </p>
      <p> En todas estas ciudades:</p>
      <p>
...

Es casi igual que en Python salvo porque no se ponen los dos puntos al final de la sentencia a evaluar.

Salida:

condicional en Django



Puedes encontrar más información sobre bucles, condicionales y otra multitud de etiquetas que puedes usar en Django ya construidos en la documentación en la sección "Built-in template tags and filters"

Otra diferencia con Python es a la hora de utilizar los métodos. Me explico. Imagina que en Python tenemos un string y queremos ponerlo en mayúsculas. Por ejemplo tengo la palabra "gacela" y quiero ponerla en mayúsculas:

"gacela".upper()

Sin embargo en Django para aplicar en la plantilla un método a este mismo string usaríamos el mismo método pero con una diferencia, prescindiríamos de los paréntesis finales ()

"gacela".upper

En el ejemplo en el que estamos trabajando si queremos poner el nombre del usuario en mayúsculas lo haríamos de la siguiente forma:

...
      <p>
            Bienvenido {{nombre_usuario.upper}}
      </p>  
      <p>
            Hoy es {{date.day}} - {{date.month}} - {{date.year}}.
...

Salída:

Condicionales en Django


Comentarios en Plantillas de Django:

Los comentarios de una sola línea tienen esta estructura:

{# Texto del comentario #}

Los de varias líneas esta otra:

{% comment %}
    texto del comentario
    texto del comentario
{% endcommnent %}


Filtros en Plantillas. (built-in filters reference)

Son elementos que se usan para filtrar la información o transformarla de alguna manera. Con los filtros puedes hacer muchas cosas en las plantillas y no solo modificar strings o texto, sino también sumar dos números, ordenar listas y muchas más. Lo mejor es ver la documentación pero vamos a ver un ejemplo.

El filtro se usa poniendo después de la variables que se quiere filtrar un "pipeline" que es el símbolo "|" y el filtro a utilizar.

Usaremos filtros para que todos los nombres de las ciudades se pongan en Mayúsculas y también para que nos diga si el día es un numero par o impar. 

plantilla.html

<!DOCTYPE html>
<html lang="es">
<head>
     <meta charset="UTF-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Fecha Servidor</title>
</head>
<body>
      {# COMENTARIO EN UNA PLANTILLA DE DJANGO de una sola línea #}
      {% comment %}
            COMENTARIO
            de varias lineas
      {% endcomment %}
      <h3>
         ¡Hola Mundo! He sido cargado desde una plantilla.         
      </h3> 
      <p>
            Bienvenido {{nombre_usuario}}
      </p>  
      <p>
            Hoy es {{date.day}} - {{date.month}} - {{date.year}}.
            {% if date.day < 15 %}
                  Estamos en la primera quincena del mes.
            {% else %}
                  Estamos en la segunda quincena del mes.
            {% endif %}

            {# Filtro para mostrar si el dia es un número par o impar. #}
            {% if date.day|divisibleby:"2" %}
                  <p>El día de hoy es un número par.</p>
            {% else %}
                  <p>El día de hoy es un número impar.</p>

            {% endif %}
      </p>
      <p> En todas estas ciudades:</p>
      <p>
            <ul>
            {% for ciudad in lugares %} <!-- Llave de apertura -->
                  <li>{{ciudad|upper}}</li>
            {% endfor %} <!-- LLave de cierre -->
            </ul>
      </p>
</body>
</html>

Salida:

uso de filtros en plantillas de Django


No obstante conviene no abusar del uso tanto de las estructuras de control, como de los filtros ya que la filosofía de Django es que la parte lógica esté en una parte "views.py" y el diseño en otro (en las plantillas).

No hay comentarios:

Publicar un comentario