Django
Es un framework web de alto nivel para Python, diseñado para facilitar el desarrollo rápido de sitios
web seguros y mantenibles. Ideal para proyectos pequeños o grandes. Su arquitectura se basa en el
patrón Modelo-Vista-Plantilla (MVT), que es similar al patrón Modelo-Vista-Controlador (MVC),
pero con diferencias clave.
• Modelo (Model) - Modelo MVC: Lógica de datos y estructura de base de datos
• Vista (View) - Controlador MVC: Lógica de negocio, respuestas HTTP, conexión Model-Template
• Plantilla (Template) - Vista MVC: Presentación, HTML renderizado
Aplicaciones web escalables
• Arquitectura modular y reutilizable.
• ORM robusto (Object-Relational Mapping).
• Admin automático para gestión de datos.
• Sistema de rutas limpio y poderoso.
• Autenticación integrada.
• Internacionalización, seguridad, escalabilidad y más, listo para producción.
Instalación de Django
Crear entorno virtual (opcional pero recomendado), donde un entorno virtual es una carpeta aislada
donde instalas paquetes de Python solo para ese proyecto, sin afectar el Python ni los paquetes
instalados globalmente en su sistema. Todos los paquetes que se instales se instalarán dentro de
env, no en todo tu sistema. Permite: Tener versiones específicas de librerías en cada proyecto, evitar
conflictos entre proyectos diferentes y mantener tu sistema limpio y ordenado.
python -m venv env
• python: llama al ejecutable de Python que tengas configurado
• -m venv: le dice a Python que use el módulo venv
• env: es el nombre de la carpeta donde se creará el entorno virtual. Puedes ponerle cualquier
nombre.
Se debe activar el entorno para usarlo:
Bash: source env/Scripts/activate
Windows: .\env\Scripts\activate
Linux/Mac: source env/bin/activate
Para desactivar el entorno: deactivate
Instalar Django
pip install django
Verificar versión instalada
django-admin --version
CREAR PROYECTO DJANGO
Crear proyecto
django-admin startproject mi_proyecto
Entrar a la carpeta y correr el servidor
cd mi_proyecto
python [Link] runserver
Acceder al navegador:
[Link]
CREAR Y CONFIGURAR UNA APLICACIÓN
Crear una app
python [Link] startapp tienda
Registrar la app en [Link], mi_proyecto/[Link]
INSTALLED_APPS = [
'[Link]',
'tienda',
Configuración básica
• INSTALLED_APPS: Agrega tu app al archivo [Link].
• DATABASES: Define el motor y credenciales de la base de datos.
• TEMPLATES: Configura la ruta a tus plantillas HTML.
• STATICFILES: Configura los recursos estáticos (CSS, JS, imágenes).
Funcionalidad Descripción
Admin automático CRUD para tus modelos sin escribir código extra
ORM Consultas a base de datos con sintaxis Python
Formularios Validación, seguridad y generación automática de campos
Middleware Lógica que se ejecuta antes o después de una petición
Seguridad Protección CSRF, XSS, inyecciones SQL, sesiones seguras
Migraciones Control de cambios en la base de datos
Autenticación Gestión de usuarios, login/logout, permisos
Escalabilidad en Django
• Usa caché (Redis/Memcached) para alto rendimiento.
• Implementa bases de datos separadas por servicios (bases distribuidas).
• Usa Docker y Kubernetes para despliegue en la nube.
• Separación clara entre frontend (SPA) y backend (API REST con DRF).
MODELOS (MODELS)
Representa la estructura de datos y se comunica con la base de datos. Este modelo crea
automáticamente una tabla en la base de datos y gestiona CRUD (Create, Read, Update, Delete).
Crear modelo
tienda/[Link]
from [Link] import models
class Producto([Link]):
nombre = [Link](max_length=100)
precio = [Link](max_digits=8, decimal_places=2)
disponible = [Link](default=True)
Crear y aplicar migraciones
Crear archivo de migración
python [Link] makemigrations
Aplicar migraciones a la base de datos
python [Link] migrate
ADMINISTRADOR DE DJANGO
Crear superusuario
python [Link] createsuperuser
tienda/[Link]
from .models import Producto
from [Link] import admin
[Link](Producto)
Admin:
[Link]
VISTAS (VIEWS) Y RUTAS (URLS)
Controla la lógica de negocio y respuesta a peticiones del usuario. La vista obtiene los datos y se los
pasa a una plantilla para ser mostrados.
from [Link] import render
from .models import Producto
def lista_productos(request):
productos = [Link]()
return render(request, '[Link]', {'productos': productos})
Vista simple
tienda/[Link]
from [Link] import HttpResponse
def inicio(request):
return HttpResponse("¡Bienvenido a la tienda!")
Enlazar URL
tienda/[Link]
from [Link] import path
from . import views
urlpatterns = [
path('', [Link], name='inicio'),
mi_proyecto/[Link]
Asocia las URLs con las vistas. Define qué función se ejecuta cuando el usuario accede a cierta URL.
from [Link] import admin
from [Link] import path, include
urlpatterns = [
path('admin/', [Link]),
path('', include('[Link]')),
path('productos/', views.lista_productos, name='lista_productos'),
TEMPLATES (PLANTILLAS)
Responsable de la presentación de datos (HTML + Django Template Language). Usa etiquetas de
plantilla de Django ({{ }} y {% %}) para insertar datos y lógica en HTML. Django usa su propio sistema
de plantillas inspirado en Jinja2, pero no es exactamente Jinja2.
templates/[Link]
<h1>Lista de productos</h1>
<ul>
{% for producto in productos %}
<li>{{ [Link] }} - ${{ [Link] }}</li>
{% endfor %}
</ul>
Estructura de un proyecto
mi_proyecto/
├ [Link]
├ mi_app/
│ ├ [Link]
│ ├ [Link]
│ ├ [Link]
│ └── templates/
│ └── [Link]
├ mi_proyecto/
│ ├ [Link]
│ ├ [Link]
│ └── [Link] / [Link]
Estructura de carpetas simple
tienda/
├ templates/
│ └── tienda/
│ └── [Link]
tienda/templates/tienda/[Link]
<h1>Productos disponibles</h1>
tienda/[Link]
from [Link] import render
def inicio(request):
return render(request, 'tienda/[Link]')
CONSULTAR DATOS DE MODELOS
[Link]
from .models import Producto
def inicio(request):
productos = [Link]()
return render(request, 'tienda/[Link]', {'productos': productos})
[Link]
<ul>
{% for producto in productos %}
<li>{{ [Link] }} - ${{ [Link] }}</li>
{% endfor %}
</ul>
FORMULARIOS Y CREACIÓN DE DATOS
Crear formulario
tienda/[Link]
from django import forms
from .models import Producto
class ProductoForm([Link]):
class Meta:
model = Producto
fields = '__all__'
Vista para crear
[Link]
from .forms import ProductoForm
def agregar_producto(request):
if [Link] == 'POST':
form = ProductoForm([Link])
if form.is_valid():
[Link]()
else:
form = ProductoForm()
return render(request, 'tienda/[Link]', {'form': form})
AUTENTICACIÓN Y PERMISOS
• Login, logout
• Decoradores @login_required
• Manejo de sesiones
• Sistema de usuarios
ARCHIVOS ESTÁTICOS Y MEDIA
• STATICFILES_DIRS → CSS, JS, imágenes.
• MEDIA_URL y MEDIA_ROOT → Archivos subidos por usuario.
DEPLOY A PRODUCCIÓN
• Configurar [Link] para producción.
• Usar gunicorn, nginx, Docker, AWS/Heroku.
API REST CON DJANGO REST FRAMEWORK (DRF)
• Serializers
• ViewSets
• Routers automáticos
• Autenticación Token
• Permisos
Ejemplo Django
Crear entorno virtual
python -m venv env
Activar el entorno
source env/Scripts/activate
Instalar Django
pip install django
Verificar versión instalada
django-admin --version
Crear proyecto y app
django-admin startproject misproductos
Django genera dos carpetas con el mismo nombre. misproductos externo es la carpeta raíz del
proyecto. Es donde se inicia el proyecto y se pueden agregar apps, archivos estáticos, etc.
[Link]
Archivo principal para ejecutar comandos de Django desde la terminal. Internamente se configura
la variable DJANGO_SETTINGS_MODULE para que Django sepa qué configuración usar.
python [Link] runserver
python [Link] startapp productos
python [Link] migrate
misproductos interno
Es el paquete de configuración del proyecto Django. Contiene los archivos que controlan el
comportamiento global del proyecto.
__init__.py
Archivo vacío que marca esta carpeta como un paquete de Python. Necesario para poder importar
desde otros archivos. Por ejemplo, permite que Django importe el paquete de configuración del
proyecto. Es requerido para que la carpeta interna del proyecto (como misproductos/) sea tratada
como parte del sistema de módulos de Python.
[Link]
Contiene toda la configuración del proyecto, es el corazón de la configuración de Django.
• Aplicaciones instaladas (INSTALLED_APPS)
• Bases de datos
• Archivos estáticos
• Seguridad
• Middleware
• Lenguaje, zona horaria, etc.
[Link]
Define las rutas del proyecto, es decir, cómo se conectan las URLs con las vistas (views). Puedes
incluir rutas de apps con include() también.
from [Link] import path
from . import views
urlpatterns = [
path('', [Link]),
[Link]
Archivo para desplegar el proyecto en servidores WSGI (como Gunicorn o uWSGI). WSGI (Web
Server Gateway Interface) es un estándar que permite a servidores web comunicarse con
aplicaciones Python. Este archivo expone la aplicación Django como una variable llamada
application.
[Link]
Igual que [Link] pero para ASGI (Asynchronous Server Gateway Interface), que permite trabajar
con: WebSockets, Tareas asíncronas. Es usado en despliegues modernos con servidores como
Daphne o Uvicorn.
Entra a la carpeta
cd misproductos
crea una app
python [Link] startapp tienda
tienda/
├ __init__.py
├ [Link]
├ [Link]
├ migrations/
│ └── __init__.py
├ [Link]
├ [Link]
├ [Link]
__init__.py
Archivo vacío que marca tienda/ como un paquete de Python y permite que Python y Django
importen esta app.
[Link]
Registras los modelos para que aparezcan en el panel de administración (/admin).
[Link]
Define la configuración de la app. Django genera una clase automáticamente. Por si luego se
quiere cambiar el nombre visible o algunas configuraciones de la app.
migrations/
Carpeta especial donde Django guardará los archivos de migraciones. Una migración es un archivo
que representa un cambio en tu base de datos (crear tablas, cambiar campos, etc.).
[Link]
Define los modelos de la app, es decir, las estructuras de datos (tablas de la base de datos). Luego
Django crea la tabla automáticamente en la base de datos.
[Link]
Archivo para escribir pruebas automáticas de la app. Sirve para asegurarte de que su código
funciona correctamente cada vez que haces cambios.
[Link]
Se define las vistas: funciones o clases que responden a solicitudes web.
Registrar la app en productos_csv/[Link]
INSTALLED_APPS = [
...
'tienda',
tienda/[Link]
id,nombre,precio
1,producto1,1000
2,producto2,2000
3,producto3,3000
4,producto4,4000
5,producto5,5000
tienda/[Link]
import csv
import os
from [Link] import render
from [Link] import settings
def mostrar_productos(request):
ruta_csv = [Link](settings.BASE_DIR, 'tienda', '[Link]')
productos = []
with open(ruta_csv, newline='', encoding='utf-8') as archivo:
lector = [Link](archivo)
for fila in lector:
[Link]({
'id': fila['id'],
'nombre': fila['nombre'],
'precio': fila['precio'],
})
return render(request, 'tienda/[Link]', {'productos': productos})
tienda/templates/tienda/[Link]
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Productos</title>
</head>
<body>
<h1>Productos</h1>
<table border="1" cellpadding="10">
<thead>
<tr>
<th>ID</th>
<th>Nombre</th>
<th>Precio</th>
</tr>
</thead>
<tbody>
{% for producto in productos %}
<tr>
<td>{{ [Link] }}</td>
<td>{{ [Link] }}</td>
<td>{{ [Link] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body> </html>
tienda/[Link]
from [Link] import path
from . import views
urlpatterns = [
path('', views.mostrar_productos, name='productos'),
]
productos_csv/[Link]
from [Link] import admin
from [Link] import path, include
urlpatterns = [
path('admin/', [Link]),
path('', include('[Link]')),
Estructura
productos_csv/
├ [Link]
├ productos_csv/
│ ├ __init__.py
│ ├ [Link]
│ ├ [Link]
│ └── [Link]
├ tienda/
│ ├ __init__.py
│ ├ [Link]
│ ├ [Link]
│ ├ templates/
│ │ └── tienda/
│ │ └── [Link]
│ └── [Link]
Ejecutar servidor
python [Link] runserver
Visitar y ver la tabla con los productos
[Link]
Migraciones pendientes.
python [Link] migrate
Esto aplicará todas las migraciones pendientes y tu proyecto quedará sincronizado. Migraciones son
cambios en la estructura de la base de datos (tablas nuevas, modificaciones, etc.). Principalmente
para las apps internas de Django (admin, auth, sessions, contenttypes).