Archivos estáticos en Django

Básico
Django
Django
Actualizado: 18/04/2026

Tipos de archivos en Django

Django distingue dos tipos de archivos no-Python:

Diagrama conceptual de Archivos estáticos en Django

  • Archivos estáticos: CSS, JavaScript, fuentes e imágenes del diseño del sitio. Son parte del código del proyecto y no cambian con el uso.
  • Archivos multimedia (media): archivos subidos por los usuarios (imágenes de perfil, documentos…). Se gestionan por separado con MEDIA_URL y MEDIA_ROOT.

Configuración de archivos estáticos

# settings.py

# URL base para servir archivos estáticos
STATIC_URL = '/static/'

# Directorios adicionales donde Django busca estáticos (además de app/static/)
STATICFILES_DIRS = [
    BASE_DIR / 'static',    # Carpeta global de estáticos del proyecto
]

# Destino de collectstatic en producción
STATIC_ROOT = BASE_DIR / 'staticfiles'

Estructura de directorios

mi_proyecto/
    static/                        # Estáticos globales del proyecto
        css/
            estilos.css
        js/
            main.js
        img/
            logo.png

catalogo/
    static/                        # Estáticos de la aplicación catalogo
        catalogo/
            css/
                catalogo.css
            js/
                catalogo.js

La convención de crear una subcarpeta con el nombre de la aplicación dentro de static/ evita colisiones de nombres al ejecutar collectstatic.

El tag {% static %}

En las plantillas, usa {% static %} para construir la URL correcta del archivo estático:

{% load static %}
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="{% static 'css/estilos.css' %}">
    <link rel="stylesheet" href="{% static 'catalogo/css/catalogo.css' %}">
    <link rel="icon" href="{% static 'img/favicon.ico' %}">
</head>
<body>
    <img src="{% static 'img/logo.png' %}" alt="Logo">

    <script src="{% static 'js/main.js' %}"></script>
    <script src="{% static 'catalogo/js/catalogo.js' %}"></script>
</body>
</html>

Nunca escribas las rutas de estáticos de forma manual (/static/css/estilos.css). El tag {% static %} genera la URL correcta independientemente de la configuración de STATIC_URL.

collectstatic

En producción, el comando collectstatic recopila todos los archivos estáticos de las aplicaciones y los copia en STATIC_ROOT:

python manage.py collectstatic

Esto copia los estáticos de:

  • static/ de cada aplicación registrada
  • Los directorios definidos en STATICFILES_DIRS

Todo a STATIC_ROOT, que luego sirve Nginx o WhiteNoise directamente.

Servir estáticos en desarrollo

Django sirve automáticamente los archivos estáticos durante el desarrollo cuando DEBUG = True mediante django.contrib.staticfiles. En producción este comportamiento se desactiva por razones de rendimiento.

WhiteNoise: estáticos en producción

WhiteNoise permite servir archivos estáticos directamente desde Django sin necesidad de Nginx, ideal para despliegues en plataformas como Heroku o Railway:

pip install whitenoise
# settings.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',   # Justo después de SecurityMiddleware
    # ...
]

# Compresión y versioning de archivos estáticos
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

WhiteNoise sirve los archivos con cabeceras de caché correctas y puede comprimir los archivos automáticamente, mejorando el rendimiento.

Fingerprinting con ManifestStaticFilesStorage

Para producción sin WhiteNoise, ManifestStaticFilesStorage añade un hash al nombre del archivo para invalidar la caché del navegador cuando el contenido cambia:

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

Con esto, main.css se convierte en main.abc123de.css, forzando al navegador a descargar la versión actualizada.

Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Django es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Django

Explora más contenido relacionado con Django y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

Configurar STATIC_URL, STATICFILES_DIRS y STATIC_ROOT en settings.py. Usar el tag {% static %} en plantillas para referenciar archivos estáticos. Ejecutar collectstatic para recopilar archivos estáticos para producción. Organizar archivos estáticos por aplicación y globalmente en el proyecto. Servir archivos estáticos en producción con WhiteNoise.