📜 Jinja2 Cheatsheet Completo 📜

Jinja2 es un motor de plantillas (template engine) para Python. Su objetivo es generar documentos de texto (como HTML, XML, CSS, o cualquier formato de texto) a partir de un template y un conjunto de datos. Es rápido, seguro (con sandboxing) y fácil de extender.


1. 🌟 Conceptos Clave


2. 🛠️ Configuración Inicial

  1. Instalación:

    pip install Jinja2
  2. Uso Básico en Python:

    from jinja2 import Environment, FileSystemLoader
    
    # Configurar el entorno de Jinja2
    # FileSystemLoader busca plantillas en la carpeta especificada
    env = Environment(loader=FileSystemLoader('templates'))
    
    # Cargar una plantilla
    template = env.get_template('index.html')
    
    # Datos para la plantilla
    data = {
        'page_title': 'Mi Página de Inicio',
        'user_name': 'Alice',
        'is_logged_in': True,
        'products': [
            {'id': 1, 'name': 'Laptop', 'price': 1200},
            {'id': 2, 'name': 'Mouse', 'price': 25},
            {'id': 3, 'name': 'Teclado', 'price': 75}
        ],
        'messages': ['Bienvenido!', 'Nuevo producto añadido.']
    }
    
    # Renderizar la plantilla con los datos
    output = template.render(data)
    print(output)
    • Crea una carpeta templates/ en el mismo directorio que tu script Python.
    • Crea templates/index.html (ver ejemplos en las secciones siguientes).

3. 📝 Sintaxis de Plantillas Jinja2

3.1. Expresiones ({{ ... }})

Para imprimir el valor de una variable o el resultado de una expresión.

3.2. Sentencias de Control ({% ... %})

Para la lógica de la plantilla.


4. 🔗 Herencia de Plantillas

Permite reutilizar la estructura de las plantillas.

templates/base.html (Plantilla Base)

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}Mi Sitio{% endblock %}</title> {# Define un bloque llamado 'title' #}
    <link rel="stylesheet" href="/static/style.css">
</head>
<body>
    <header>
        <h1>{% block header_title %}Encabezado General{% endblock %}</h1>
        <nav>
            <ul>
                <li><a href="/">Inicio</a></li>
                <li><a href="/about">Acerca</a></li>
            </ul>
        </nav>
    </header>

    <main>
        {% block content %} {# Define un bloque llamado 'content' #}
            {# Contenido por defecto si no se sobrescribe #}
            <p>Este es el contenido base.</p>
        {% endblock %}
    </main>

    <footer>
        <p>© 2023 Mi Sitio. {% block footer_extra %}{% endblock %}</p>
    </footer>
</body>
</html>

templates/page.html (Plantilla Hija)

{% extends "base.html" %} {# Extiende la plantilla base #}

{% block title %}Acerca de Nosotros - {{ super() }}{% endblock %} {# Sobrescribe el bloque 'title' y añade al contenido del padre #}

{% block header_title %}Acerca de{% endblock %} {# Sobrescribe completamente 'header_title' #}

{% block content %} {# Sobrescribe el bloque 'content' #}
    <h2>Acerca de Nuestra Empresa</h2>
    <p>Somos una empresa dedicada a...</p>
{% endblock %}

{% block footer_extra %}
    <p>Información adicional de contacto.</p>
{% endblock %}

5. ⚙️ Filtros

Transforman el valor de una expresión. Se usan con el operador pipe |.


6. ✔️ Tests

Comprueban si una variable cumple una cierta condición. Se usan con el operador is.


7. 🗂️ Inclusión de Plantillas (include, import, macro)


8. ⚠️ Control de Espacios en Blanco

Jinja2 puede dejar mucho espacio en blanco.


9. 🔒 Seguridad


10. 💡 Buenas Prácticas y Consejos