Uso de Contextos en Plantillas de Django¶
1. Introducción¶
En Django, el contexto es un diccionario de datos que pasamos desde la vista a la plantilla para rellenar dinámicamente los valores dentro del HTML. Esto permite que nuestras plantillas sean dinámicas, ya que los datos mostrados pueden cambiar dependiendo de la solicitud del usuario, como el nombre de usuario, valores de una base de datos o cualquier otro dato relevante.
Contexto en Plantillas
El contexto es el medio por el cual Django pasa información desde la vista (backend) hasta la plantilla (frontend), permitiendo personalizar el contenido que se muestra al usuario.
2. Paso a paso para crear una plantilla dinámica¶
2.1 Crear una nueva ruta dinamico/¶
Vamos a crear una ruta que acepte un parámetro en la URL, como el nombre de usuario, y lo pase a una plantilla.
- Definir la nueva ruta en
urls.py:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('dinamico/<str:nombre>/', views.dinamico, name='dinamico'),
]
Esta ruta capturará un parámetro nombre de tipo string de la URL, como http://127.0.0.1:8000/dinamico/juan/.
2.2 Crear una nueva plantilla básica¶
Vamos a crear la plantilla dinamico.html que inicialmente solo mostrará un mensaje de "Hola Mundo". Más tarde, modificaremos la plantilla para mostrar datos dinámicos.
- Crear el archivo
dinamico.htmlen la carpetatemplates:
De momento vamos a crear un template estético, luego, cuando definamos el contexto ya lo modificaremos.
1 2 3 4 5 6 7 8 9 10 11 | |
2.3 Definir la vista y pasar un contexto¶
En la vista, vamos a cargar la plantilla dinamico.html y pasar un contexto que contenga el nombre del usuario.
- Crear la vista en
views.py:
No sería necesario, pero queda más claro si definimos una variable para el contexto.
# views.py
from django.shortcuts import render
def dinamico(request, nombre):
contexto = {'nombre': nombre} # Creamos un contexto con el nombre
return render(request, 'dinamico.html', contexto) # Pasamos el contexto a la plantilla
- En este ejemplo, estamos creando un diccionario
contextocon el parámetronombreque capturamos de la URL, y lo pasamos a la plantilla con el métodorender().
2.4 Modificar la plantilla para usar el contexto¶
Ahora que hemos pasado el contexto con el nombre del usuario, vamos a modificar la plantilla para mostrar el nombre dinámicamente.
- Modificar
dinamico.htmlpara usar la variablenombredel contexto:
1 2 3 4 5 6 7 8 9 10 11 | |
{{ nombre }}es donde Django insertará el valor de la variablenombreque hemos pasado desde la vista.
3. Poner en marcha el servidor y probar¶
- Levantar el servidor si aún no está activo:
python manage.py runserver
- Accede a
http://127.0.0.1:8000/dinamico/juan/en tu navegador, y deberías ver el mensaje "Hola Juan!".
Prueba con diferentes nombres en la URL, como http://127.0.0.1:8000/dinamico/maria/.
4. Modificar el ejemplo para que admita un array¶
Ahora vamos a modificar la vista para que también pase una lista de categorías, y lo mostrará en el template.
4.1 Modificar views.py para incluir categorías¶
Vamos a crear una lista de categorías y agregarla al contexto:
# views.py
from django.shortcuts import render
def dinamico(request, nombre):
categorias = ['Programador', 'Diseñador', 'Ventas']
contexto = {'nombre': nombre, 'categorias': categorias}
return render(request, 'dinamico.html', contexto)
categoriases una lista con varios elementos que pasaremos al contexto.
4.2 Mostrar el array en la plantilla¶
En el archivo dinamico.html, inicialmente intentaremos mostrar el array completo como texto.
1 2 3 4 5 6 7 8 9 10 11 12 | |
- En este caso, veremos cómo se muestra la lista completa en el navegador, como una representación de un array en formato de texto.
5. Bucles y condiciones en las plantillas¶
Ahora vamos a recorrer la lista de categorías y mostrar cada una en una lista. También vamos a destacar si la categoría es "Programador".
5.1 Crear un bucle en la plantilla para recorrer las categorías¶
Primero vamos a mostrar las categorias en una lista:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Ahora que hemos aprendido a manejar la estructura for para poder manejas las listas, vamos a ver el uso de condicionales. En este caso queremos que muestre destacado (negrita) la categoria progamador.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
{% for categoria in categorias %}: Este es el bucle que recorre cada elemento de la listacategorias.{% if categoria == "Programador" %}: Esta condición verifica si la categoría es "Programador" y la pone en negrita (<b>).
6. Mostrar el resultado y comprobar el funcionamiento¶
- Levanta el servidor si no está en marcha:
python manage.py runserver
- Accede a la URL
http://127.0.0.1:8000/dinamico/juan/, y deberías ver algo similar a:
Hola Juan!
Categorías:
- Programador
- Diseñador
- Ventas
Donde "Programador" aparecerá en negrita.
Perfecto, modificaremos el ejercicio para que pase al contexto un número N (el número máximo de frutas a mostrar) y un nombre de fruta que debe ser destacado si coincide con uno de los elementos de la lista. Aquí tienes el ejercicio actualizado:
7. Comentarios¶
Ahora veremos como podemos hacer comentarios en las plantillas, que no usan los comentarios <!-- --> por ser un lenguaje de marcado. Estos comentarios serán visibles en el código fuente HTML generado, pero no se mostrarán en el navegador. En su lugar, utilizamos el siguiente formato:
{% comment %}
Este es un comentario
de varias líneas en la plantilla
{% endcomment %}
Si quiero hacer un comentario más corto puedo:
{# Este es un comentario corto #}
8. Filtros¶
Los filtros en Django son una forma de modificar el contenido que se muestra en las plantillas. Se aplican utilizando el símbolo | (pipe) y pueden ser encadenados.
Claro, aquí tienes el punto 8.1 Ejemplos de filtros modificado, siguiendo la estructura que pides: primero la explicación de la sintaxis general de los filtros y luego una tabla con los filtros, su descripción y ejemplos.
Sintaxis general de los filtros¶
En Django, los filtros permiten modificar el valor de una variable en las plantillas antes de mostrarlo. Los filtros se aplican con la sintaxis {{ variable|filtro }}, donde variable es el valor que queremos modificar y filtro es el tipo de modificación que queremos aplicar.
Sintaxis de Filtros
La sintaxis básica de un filtro es:
{{ variable|filtro }}
````
Además, los filtros pueden aceptar **argumentos**, los cuales se pasan después de un **colon (:)**. Por ejemplo:
```html
{{ nombre|default:"Desconocido" }}
Filtros comunes en Django¶
Aquí tienes una tabla con algunos de los filtros más utilizados en Django, junto con su descripción y ejemplos.
| Filtro | Descripción | Ejemplo | |
|---|---|---|---|
length |
Devuelve la longitud de una lista o cadena. | {{ frutas|length }} | |
slice |
Permite obtener una porción de una lista o cadena. | {{ frutas|slice:":3" }} | |
default |
Muestra un valor por defecto si la variable está vacía o no definida. | {{ fruta_destacada|default:"Ninguna" }} | |
upper |
Convierte una cadena a mayúsculas. | {{ nombre|upper }} | |
lower |
Convierte una cadena a minúsculas. | {{ nombre|lower }} | |
date |
Formatea una fecha en un formato específico. | {{ fecha|date:"d M Y" }} | |
join |
Une los elementos de una lista en una cadena, utilizando un separador. | {{ frutas|join:", " }} | |
default_if_none |
Muestra un valor por defecto si la variable es None. |
{{ descripcion|default_if_none:"No disponible" }} | |
escape |
Escapa caracteres especiales en una cadena para que se muestren como texto. | {{ texto_html|escape }} | |
urlencode |
Codifica una cadena en formato URL. | {{ url|urlencode }} | |
first |
Devuelve el primer elemento de una lista. | {{ frutas|first }} |
Ejemplos prácticos¶
- Filtro
length: Devuelve la longitud de una lista o cadena.
<p>La lista de frutas tiene {{ frutas|length }} elementos.</p>
- Si
frutases['Manzana', 'Plátano', 'Cereza'], el resultado será: La lista de frutas tiene 3 elementos.
- Filtro
slice: Permite obtener una porción de una lista o cadena.
<p>Las primeras 3 frutas son: {{ frutas|slice:":3" }}</p>
- Si
frutases['Manzana', 'Plátano', 'Cereza', 'Pera', 'Mango'], el resultado será: Las primeras 3 frutas son: Manzana, Plátano, Cereza
- Filtro
default: Muestra un valor por defecto si la variable está vacía o no definida.
<p>Fruta destacada: {{ fruta_destacada|default:"Ninguna" }}</p>
- Si
fruta_destacadaesNoneo no está definida, el resultado será: Fruta destacada: Ninguna
- Filtro
upper: Convierte una cadena a mayúsculas.
<p>Nombre en mayúsculas: {{ nombre|upper }}</p>
- Si
nombreesjuan, el resultado será: Nombre en mayúsculas: JUAN
Otros filtros útiles
lower: Convierte a minúsculas.date: Formatea fechas.join: Une los elementos de una lista en una cadena.
9. Ejercicios prácticos¶
Ejercicio para el alumno
-
Objetivo: Crear una ruta y vista llamada
frutasque reciba como parámetros un númeroN(el número máximo de frutas a mostrar) y un nombre de fruta. La vista debe pasar al contexto una lista de frutas y la plantilla debe mostrar solo las primerasNfrutas. Además, si el nombre de la fruta en la lista coincide con el nombre pasado como parámetro, se debe destacar esa fruta. -
Parámetros en la URL:
N: El número máximo de frutas a mostrar.fruta_destacada: El nombre de la fruta que debe ser destacada en la lista.
Ejemplo de solución
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Objetivo: Crear una plantilla que muestre el nombre del usuario en mayúsculas y la cantidad de frutas que posee en una lista.
Ejercio 2
Utiliza los filtros para mostrar el nombre de usuario en mayúscula y la cantidad de frutas al final de la lista.
Solución
# views.py
def mostrar_usuario(request, nombre):
frutas = ['Manzana', 'Plátano', 'Cereza']
contexto = {'nombre': nombre, 'frutas': frutas}
return render(request, 'usuario.html', contexto)
<!-- templates/usuario.html -->
<h1>Hola {{ nombre|upper }}</h1>
<p>Tienes {{ frutas|length }} frutas en tu lista.</p>
10. Resumen¶
En este ejercicio, hemos aprendido a trabajar con parámetros en las rutas para pasar datos dinámicos a las plantillas. Hemos visto cómo limitar la lista de frutas usando el parámetro N y cómo destacar una fruta en la lista usando el parámetro fruta_destacada. Esto muestra cómo hacer plantillas más interactivas con Django, utilizando tanto parámetros de la URL como lógica en la plantilla.