sƔbado, 25 de julio de 2020

Flask 9. Herencia de Plantillas.



Herencia de Plantillas


Cuando se construye un sitio web, normalmente se suele hacer una plantilla base, que tendrĆ” la estructura bĆ”sica de la plantilla, es decir, recogerĆ” todo lo que quieres que tengan en comĆŗn todas tus plantillas. A la plantilla base se le suele llamar base.html. Esto es muy Ćŗtil, ya que nos va a ahorrar mucho tiempo y escritura de cĆ³digo. 

Por ejemplo, en nuestro sitio web todas las pĆ”ginas tendrĆ”n la misma cabecera, barra de navegaciĆ³n y pie de pĆ”gina que serĆ” comĆŗn a todas, solo variarĆ” el contenido de la parte principal. Si no existiera la herencia tendrĆ­amos que escribir el cĆ³digo html de los elementos comunes en cada una de las pĆ”ginas, pero con esto, lo que haremos serĆ” escribir el cĆ³digo de ellos en una plantilla base o padre y usaremos ese cĆ³digo en todas las pĆ”ginas hijas que hagamos.

Plantillas Incrustadas.


Antes de afrontar el tema de la herencia de plantillas vamos a parar un momento para ver un tema relacionado, como es el de incrustar cĆ³digo html que este en otro archivo:

{% include "nombre_archivo_html" %}

donde "nombre_archivo_html" contendrĆ” el cĆ³digo a insertar.


¿Por quĆ© hacer esto? 

La respuesta es que si tenemos elementos individuales, como puede ser la barra de navegaciĆ³n, cuyo cĆ³digo esta en un archivo a parte del principal, si algĆŗn dĆ­a tenemos que modificarlos (por ejemplo aƱadir mĆ”s pĆ”ginas a la barra de navegaciĆ³n) es mĆ”s fĆ”cil de hacer en un cĆ³digo breve que tenemos controlado, que no buscar dentro de un archivo, que en nuestra caso no porque nuestra plantilla base es muuuuy sencilla, pero que en una pĆ”gina profesional podrĆ­a tener miles de lineas de cĆ³digo.

Sigamos trabajando y de paso repasamos algunos conceptos ya vistos.

Lo primero creamos nuestro directorio de trabajo, el archivo de Flask que tendrĆ” la aplicaciĆ³n y los directorios para las plantillas html (templates) y contenido estĆ”tico (static)




El archivo inicio.py, tendrĆ” una Ćŗnica vista, que es la primera que veremos nada mas ejecutar la aplicaciĆ³n. En ella se rendizarĆ” la plantilla base.html. 

                         

El cĆ³digo de base.html, que como ya hemos dicho tiene que estar en la carpeta "templates", quedarĆ­a:


Como ves, en la lĆ­nea 15, insertamos el cĆ³digo de la barra de navegaciĆ³n con:

{% include "nav.html" %}

El cĆ³digo html de la barra de navegaciĆ³n, que tambiĆ©n estĆ” guardado dentro de la carpeta "templates" con el nombre de "nav.html" serĆ­a:

 


Si hubiƩramos creado otra carpeta dentro de "templates" y lo hubiƩramos guardado allƭ, habrƭa que especificar su ruta relativa dentro de las comillas.

Bien, si ejecutamos la aplicaciĆ³n de Flask con:

$python3 inicio.py

El resultado serƭa el que esperƔbamos, es decir:

                            


Herencia de Plantillas.


La plantilla base.html va a ser nuestra plantilla padre. La vamos a utilizar para construir tres plantillas hijas, que heredarĆ”n los elementos comunes de su padre (header, barra de navegaciĆ³n y footer), y que se corresponderĆ”n con cada una de las pĆ”ginas de nuestro sitio web. (Inicio, Pagina Uno, Sobre Nosotros). Sin embargo, ten en cuenta que si una plantilla hija tiene algĆŗn elemento que tambiĆ©n este definido en la plantilla padre, los elementos de esta Ćŗltima prevalecerĆ”n sobre las de la plantilla padre. 

Por ejemplo, en la plantilla padre has definido un determinado footer y en la hija otro distinto, el footer de la plantilla hija prevalece sobre la de la padre. No habrĆ” herencia.

Empecemos modificando la plantilla base.html que ya tenemos para indicar las partes o bloques que las otras plantillas pueden escribir. Si tuviƩramos hoja de estilos tendrƭamos que definirlas aquƭ. En este fichero incluiremos los bloques:

{% block title %} {% endblock %}
{% block content %} {% endblock %}

para definir el titulo y el contenido de las pƔginas hijas.

Lo que hacemos es crear una plantilla cuyo cĆ³digo html haremos que se repita en las demĆ”s, pero dejaremos los bloques que hemos comentado anteriormente para que cada una de las pĆ”ginas hijas escriba ahĆ­ su propio cĆ³digo. Puedes usar tantos bloques como necesites, no tienes que limitarte a estos dos. 

base.html





Inicio.py

En el archivo de vistas hemos creado las vistas para cada una de las pƔginas.


Como ya hemos definido las diferentes vistas, tenemos que modificar el archivo nav.html que contiene el  menĆŗ de navegaciĆ³n, que hemos incluido en el cĆ³digo al principio del capĆ­tulo. Tiene que recoger la direcciĆ³n de cada una de las pĆ”ginas, lo que haremos utilizando el mĆ©todo url_for.

nav.html


Y AHORA VIENE LA GRACIA DEL ASUNTO....

Si te fijas la plantilla padre, base.html, tiene 20 lĆ­neas de cĆ³digo y sin contar las de la barra de navegaciĆ³n que estĆ”n aparte en el archivo nav.html. Pues bien, si no usĆ”ramos herencia, tendrĆ­amos que copiar todo esto en cada una de las pĆ”ginas que diseƱemos junto con las modificaciones necesarias para que mostrarĆ”n lo que queremos que aparezcan en cada una de ellas. Sin embargo usando la herencia:

inicio.html



Esta primera plantilla hija la comenzamos diciendo que use la plantilla padre con la instrucciĆ³n:

{% extends "base.html" %}

Para continuar reescribiendo los dos bloques, con lo que estamos diciendo al programa que busque estos bloques en la plantilla padre y que los sustituya por los que hemos puesto en esta plantilla.

El primero {% block title %} {% endblock %} modifica el tĆ­tulo de la vista de inicio.

El segundo {% block content %} {% endblock %} mostrarĆ” el contenido propio de la pĆ”gina de inicio.

pagina_uno.html


Exactamente como antes. Heredamos el cĆ³digo de la plantilla "base.html" 

{% extends "base.html" %}

y definimos los bloques se se insertarƔn y que se mostrarƔn en el diseƱo de la PƔgina Uno (tƭtulo y contenido)


sobre_nosotros.html


Lo mismo que en los casos anteriores.


Ejecuta el programa y comprueba como funcionan cada una de las vistas.


Vista o pƔgina

                        

Vista para

                    

Vista para

                    

Baste decir que todos los archivos html  estĆ”n el directorio "templates"




No hay comentarios:

Publicar un comentario