Manejo de archivos estáticos en Django: configuración, ejemplos y buenas prácticas

Video thumbnail

Una vez que conocemos los DetailView en Django para páginas de detalles, lo siguiente en la lista es mostrarlo con estilo, para ello, debemos de aprender a manejar archivos de CSS, JavaScript, etc.

Cuando configuré mi primer proyecto Django, lo que más me costó entender fue cómo el framework gestionaba los archivos CSS, JavaScript e imágenes. Después de varios intentos y errores, comprendí que el manejo correcto de los archivos estáticos es la clave para que una aplicación web tenga estilo, interacción y buena organización.

En esta guía te muestro cómo configurar, organizar y servir los archivos estáticos en Django, además de integrar librerías externas como Bootstrap y Font Awesome sin complicaciones.

1. ¿Qué son los archivos estáticos en Django y para qué sirven?

Los archivos estáticos son los recursos que no cambian con el tiempo: hojas de estilo (CSS), scripts (JS), imágenes, íconos, fuentes, etc.

Django tiene un sistema integrado para gestionarlos de forma ordenada, tanto en desarrollo como en producción.

Cuando configuré mi entorno, descubrí que Django no sirve automáticamente estos archivos fuera del modo de desarrollo. Por eso es esencial entender cómo decirle al framework dónde encontrarlos y cómo distribuirlos.

2. Configuración inicial: habilitando los archivos estáticos en settings.py

El primer paso para manejar archivos estáticos es editar el archivo settings.py de tu proyecto.
Ahí debes incluir la siguiente configuración básica:

STATIC_URL = 'static/'

En mi caso, con esa sola línea Django ya reconocía la carpeta static en cada aplicación.

Sin embargo, para proyectos más grandes o cuando pasas a producción, es necesario definir dos variables más:

STATICFILES_DIRS = [BASE_DIR / "static"]
STATIC_ROOT = BASE_DIR / "staticfiles"
  • STATICFILES_DIRS: le dice a Django dónde buscar archivos estáticos adicionales.
  • STATIC_ROOT: define la carpeta donde Django recopila todos los archivos cuando ejecutas collectstatic.

Diferencia entre desarrollo y producción

En desarrollo, Django sirve los archivos directamente desde las carpetas static.

En producción, debes ejecutar:

$ python manage.py collectstatic

Este comando copia todos los archivos a la carpeta STATIC_ROOT, lista para ser servida por un servidor web o una librería como WhiteNoise.

Para poder emplear archivos estáticos en el proyecto, configuramos la siguiente variable:

customlogin\customlogin\settings.py

STATIC_URL = "static/"

Más información en:

https://docs.djangoproject.com/en/dev/howto/static-files/

3. Estructura de carpetas y buenas prácticas de organización

Una de las cosas que más me ayudó a mantener orden fue estructurar las carpetas estáticas dentro de cada aplicación.
Por ejemplo:

project/

├── customlogin/
│   └── settings.py

├── account/
│   └── static/
│       └── bootstrap/

├── elements/
│   └── static/
│       └── fontawesome/


En mi proyecto, tenía rutas como account/static/ y elements/static/, lo que me permitió separar los estilos y scripts por módulo o app.

Consejos prácticos:

  • Usa nombres consistentes (por ejemplo, static/css, static/js, static/img).
  • Evita duplicar archivos CSS o JS entre apps.
  • Centraliza tus librerías externas en una carpeta común (static/lib/).

4. Cómo integrar Bootstrap y Font Awesome en tu proyecto Django

En esta sección principalmente vamos a querer personalizar algunos templates y conocer sus comportamientos; una de las claves de esta personalización es que tenga un buen diseño, y es por eso que volveremos a emplear Bootstrap.

Comencemos instalando Bootstrap; al ser CodeIgniter un framework sin ninguna vinculación con Node, debemos de usar las CDN de Bootstrap la cual podemos obtener desde la página oficial:

https://getbootstrap.com/

Presionas sobre "Download" y luego nuevamente sobre "Download" en el siguiente apartado:

Pagina para descargar Bootstrap 5
Pagina para descargar Bootstrap 5

Bootstrap, al ser un framework web del lado del cliente, usa CSS y JavaScript para poder utilizar cualquier componente o funcionalidad de Bootstrap; una vez descargado el comprimido anterior y generada la carpeta (la cual, para simplificar el proceso, renombramos como bootstrap) necesitamos los siguientes archivos:

account/static/

<link rel="stylesheet" href="{% static 'bootstrap\css\bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'fontawesome\css\all.min.css' %}">

Que vamos a copiar dentro de la carpeta static del proyecto:

Jerarquía de carpetas en el proyecto
Jerarquía de carpetas en el proyecto
  • bootstrap/css/bootstrap.min.css
  • bootstrap/js/bootstrap.min.js

También instalamos la dependencias de popper que puedes obtener desde la misma página de Bootstrap; instalamos Fontawesome para la iconografía:

<link rel="stylesheet" href="{% static 'fontawesome\css\all.min.css' %}">

Recuerda descargar los archivos fuentes para web de manera gratuita de:

https://fontawesome.com/

Con Fontawesome tenemos acceso a múltiples iconos en SVG ya listos para emplear.

También existe un paquete específico para Django en el caso de que lo prefieras configurar de esa manera:

https://fontawesome.com/docs/web/use-with/python-django

Configuramos en el template maestro de Django:

proyect\app\templates\base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
    
{% load static %}

    {% block head %}
        <link rel="stylesheet" href="url('{% static 'bootstrap/css/bootstrap.min.css' %}'">
        <title>{% block title %} Admin {% endblock %}</title>    
    {% endblock %}
    
</head>
<body>
    {% block content %}

    {% endblock %}

    {% block footer %}
        Admin - <a href="#">Contact</a>
    {% endblock %}

  <script src="url('{% static 'bootstrap/js/bootstrap.min.js' %}'"></script>
</body>
</html>

Y esto es todo, ya con esto, podemos usar Bootstrap 5 en una aplicación en Django; puedes probar otros componentes de Bootstrap, como el de crear un container:

proyect\app\templates\base.html

<div class="container">
{% block content %}
   
{% endblock  %}
</div>

Muy útil para evitar que todo el contenido aparezca alargado, siguiendo las siguientes reglas:

Desde tu herramienta de consola de desarrolladores, puedes observar esta opción que parece un teléfono con una computadora detrás.

  • Por aquí podemos ver el tamaño del cliente, que sería la resolución de la pantalla.
  • Este es el navegador.
  • Y este es el container, es decir, el tamaño que tiene el contenedor de nuestro contenido.

Por ejemplo:

  • Si la pantalla del cliente es de 1500 px, que es mayor a 1400 px, como indica la consola, el container tendrá un tamaño máximo de 1320 px.
  • Esto se define mediante media queries en CSS, donde puedes ver que el tamaño máximo del contenedor está limitado a 1320 px.

Cuando la pantalla sea menor a 1400 px, el tamaño del contenedor se ajustará a 1100 px, y así sucesivamente para los demás rangos de resolución.

Si reducimos un poco la pantalla, verás que al pasar de los 1400 px, el container se encoge automáticamente. Esto se logra utilizando otro media query, tal como puedes observar en el código CSS.

Con esto, definimos correctamente el tamaño del contenedor para nuestro contenido, garantizando que se adapte de manera responsiva a diferentes resoluciones de pantalla.

Tienes varios tipos:

  • container-sm
  • container-lg
  • container

Otra opción: Usar CDNs (más rápido y sencillo)

Visita getbootstrap.com y fontawesome.com para copiar los enlaces.

Pegas los <link> dentro del bloque <head> de tu plantilla base y listo.

5. Servir archivos estáticos en producción: WhiteNoise y collectstatic

Cuando migré mi proyecto al entorno de producción, tuve que aprender a servir los archivos sin depender de un servidor externo.

WhiteNoise: la solución sencilla

Agrega WhiteNoise en settings.py:

MIDDLEWARE = [
   'django.middleware.security.SecurityMiddleware',
   'whitenoise.middleware.WhiteNoiseMiddleware',
   ...
]

Ejecuta luego:

$ python manage.py collectstatic

Con eso, Django recopila todos los archivos y WhiteNoise se encarga de servirlos de forma eficiente.

Comparativa rápida
Entorno    Configuración clave    Servido por
Desarrollo    STATICFILES_DIRS    Django
Producción    STATIC_ROOT + WhiteNoise    Servidor o middleware

6. Errores comunes y cómo solucionarlos

Durante mis primeras pruebas cometí errores típicos como estos:

Error    Causa    Solución
Archivos que no cargan    Falta {% load static %} en el template    Añadir {% load static %} al inicio
404 en producción    No ejecutaste collectstatic    Correr python manage.py collectstatic
CSS sin aplicar    Rutas mal definidas o duplicadas    Revisar estructura y nombres de carpeta
Lentitud en carga    Archivos pesados o sin compresión    Usar WhiteNoise + compresión GZIP

7. Conclusiones: lo que aprendí al manejar archivos estáticos en Django

Después de trabajar varias veces con este sistema, comprendí que el secreto está en mantener la organización y entender la relación entre las variables STATIC_URL, STATICFILES_DIRS y STATIC_ROOT.

Dominar los archivos estáticos en Django no solo mejora la apariencia de tus aplicaciones, sino también su rendimiento y mantenibilidad.

Integrar Bootstrap y Font Awesome fue el paso que convirtió un simple proyecto funcional en una aplicación visualmente profesional.

Preguntas frecuentes (FAQ)

  • ¿Qué diferencia hay entre STATIC_URL y STATIC_ROOT?
    • STATIC_URL define la ruta pública de acceso a los archivos.
    • STATIC_ROOT indica dónde se recopilan todos los archivos para producción.
  • ¿Dónde se deben guardar los archivos CSS y JS?
    • Dentro de la carpeta static de cada aplicación o en una carpeta global definida en STATICFILES_DIRS.
  • ¿Cómo usar Bootstrap y Font Awesome en Django?
    • Puedes usar CDNs o descargar los archivos locales y referenciarlos con {% static %}.
  • ¿Por qué mis archivos estáticos no se muestran en producción?
    • Probablemente no ejecutaste collectstatic o falta configurar WhiteNoise.
  • ¿Cómo usar WhiteNoise en un servidor sin Nginx
    • Simplemente añádelo al middleware y Django se encargará de servir los archivos.

El siguiente paso, aprende a usar la sesión en Django.

Acepto recibir anuncios de interes sobre este Blog.

Aprende a configurar y servir archivos estáticos en Django paso a paso. Incluye ejemplos reales, integración con Bootstrap y Font Awesome, CSS, JavaScript, imágenes, y soluciones a errores comunes.

| 👤 Andrés Cruz

🇺🇸 In english