Red social para ayudar a reunir gatos perdidos con sus familias. Los usuarios pueden publicar, editar y eliminar posts de gatos perdidos, encontrados o en adopción, contactarse entre sí mediante mensajería interna, leer el blog y enviar mensajes de contacto.
- Características
- Tecnologías
- Estructura del proyecto
- Instalación
- Variables de entorno
- Apps y modelos
- Rutas
- 🔐 Autenticación completa — Registro, login, logout con usuario personalizado basado en
AbstractUser - 👤 Perfil de usuario — Edición de datos personales, avatar con preview y cambio de contraseña
- 🔑 Recupero de contraseña — Flujo completo por email con templates personalizados
- 🐱 CRUD de publicaciones — Crear, editar y eliminar posts de gatos perdidos, encontrados o en adopción con subida de imágenes
- 💌 Sistema de mensajería — Contacto entre usuarios con hilo de conversación agrupado por post
- 📝 Blog — Entradas con editor de texto enriquecido (CKEditor), categorías y filtros
- 📬 Formulario de contacto — Con captcha para evitar spam
- 🛡️ Panel de administración — Gestión completa con Django Admin
- 📍 Filtros — Filtrar publicaciones y blog por tipo, provincia y categoría con paginación
- 🌐 Interfaz responsive — Frontend construido con Tailwind CSS y navbar mobile con hamburguesa animada
- 🇦🇷 Localización — Configurado para Argentina (
es-ar) con todas las provincias
| Tecnología | Uso |
|---|---|
| Django 6.0 | Framework web principal |
| django-ckeditor | Editor de texto enriquecido para el blog |
| django-simple-captcha | Captcha en el formulario de contacto |
| Pillow | Procesamiento de imágenes |
| python-dotenv | Variables de entorno |
| Tailwind CSS 4 | Estilos del frontend |
| SQLite | Base de datos (desarrollo) |
miramichis/
├── manage.py
├── db.sqlite3
├── .env
├── requirements.txt
│
├── config/ # Configuración del proyecto
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
│ └── asgi.py
│
├── core/ # App principal: home e index
│ ├── choices.py # Enum de provincias argentinas
│ ├── views.py # Vista del index
│ └── urls.py
│
├── users/ # Gestión de usuarios
│ ├── models.py # User (AbstractUser)
│ ├── forms.py # Register, Login, EditProfile, ChangePassword
│ ├── views.py # Auth + dashboard + perfil
│ ├── admin.py
│ └── templates/
│ ├── registro.html
│ ├── login.html
│ ├── dashboard.html
│ ├── edit_profile.html
│ ├── password_change.html
│ ├── password_reset.html
│ ├── password_reset_done.html
│ ├── password_reset_confirm.html
│ └── password_reset_complete.html
│
├── posts/ # Publicaciones de gatos
│ ├── models.py # PostPet + Message
│ ├── views.py # CRUD posts + mensajería
│ └── templates/
│ ├── post_list.html
│ ├── post_detail.html
│ ├── postpetform.html
│ └── chat_detail.html
│
├── blog/ # Blog
│ ├── models.py # BlogPost con CKEditor
│ ├── views.py
│ └── templates/
│ ├── blog_list.html
│ └── blog_detail.html
│
├── contact/ # Formulario de contacto
│ ├── models.py # ContactMessage
│ ├── forms.py # ContactForm con captcha
│ ├── views.py
│ └── templates/
│ └── contact.html
│
├── templates/ # Templates globales
│ └── base.html
│
├── static/
│ └── js/
│ └── navbar.js # Hamburguesa responsive
│
└── media/ # Archivos subidos (no versionar)
├── avatars/
├── posts/
└── blog_covers/
git clone https://github.com/sebsolezzi88/Django-Red-Gatos.git
cd Django-Red-Gatospython -m venv venv
# Linux / macOS
source venv/bin/activate
# Windows
venv\Scripts\activatepip install -r requirements.txtCrear el archivo .env en la raíz (ver sección siguiente).
python manage.py migratepython manage.py createsuperuserpython manage.py runserverLa app estará disponible en http://127.0.0.1:8000
Crear un archivo .env en la raíz:
SECRET_KEY=tu_clave_secreta_muy_seguraPara producción, agregar la configuración de email SMTP:
SECRET_KEY=tu_clave_secreta
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USE_TLS=True
EMAIL_HOST_USER=tu@gmail.com
EMAIL_HOST_PASSWORD=tu_app_password
⚠️ Nunca subas el.enva un repositorio público. Ya está incluido en el.gitignore.
| Campo | Tipo | Descripción |
|---|---|---|
| id | UUID | Clave primaria |
| username | CharField | Único, máx. 25 caracteres |
| name / surname | CharField | Nombre y apellido |
| EmailField | Único | |
| gender | TextChoices | M / F / O / P |
| province | TextChoices | Provincias argentinas (código) |
| city | CharField | Ciudad |
| birthday | DateField | Validación de mayoría de edad |
| bio | TextField | Biografía opcional (máx. 200 chars) |
| avatar | ImageField | Se guarda con nombre UUID |
| created_at | DateTimeField | Fecha de registro |
PostPet:
| Campo | Tipo | Descripción |
|---|---|---|
| id | UUID | Clave primaria |
| name / breed | CharField | Nombre y raza |
| gender | TextChoices | Macho / Hembra / Desconocido |
| age | CharField | Edad aproximada |
| type | TextChoices | Perdido / Encontrado / Adopción |
| status | TextChoices | Activa / Cerrada |
| province / city | CharField | Ubicación |
| description | TextField | Descripción |
| image | ImageField | posts/YYYY/MM/ |
| author | FK → User | Autor del post |
| created_at / ends_at | DateTimeField | Fechas |
Message:
| Campo | Tipo | Descripción |
|---|---|---|
| id | UUID | Clave primaria |
| body | TextField | Contenido |
| is_read | Boolean | Estado de lectura |
| sender / receiver | FK → User | Participantes |
| post | FK → PostPet | Post relacionado |
| Campo | Tipo | Descripción |
|---|---|---|
| id | UUID | Clave primaria |
| title | CharField | Título |
| image | ImageField | Miniatura opcional |
| content | RichTextField | Contenido con CKEditor |
| category | CharField | salud / consejos / historias / nutricion / ayuda / curiosidades |
| created_at | DateTimeField | Fecha |
| Campo | Tipo | Descripción |
|---|---|---|
| id | UUID | Clave primaria |
| full_name / email | CharField | Datos del remitente |
| reason | CharField | Asunto |
| message | TextField | Mensaje |
| read | Boolean | Leído por admin |
| shipping_date | DateTimeField | Fecha de envío |
| Ruta | Nombre | Descripción |
|---|---|---|
/ |
home |
Home con stats, posts y blog recientes |
/posts/ |
post_list |
Listado con filtros y paginación |
/posts/<uuid>/ |
post_detail |
Detalle de un post |
/blog/ |
blog_list |
Listado del blog con filtros |
/blog/<uuid>/ |
blog_detail |
Detalle de entrada del blog |
/contacto/ |
contact |
Formulario de contacto con captcha |
| Ruta | Nombre | Descripción |
|---|---|---|
/auth/registro/ |
register |
Registro de usuario |
/auth/login/ |
login |
Inicio de sesión |
/auth/logout/ |
logout |
Cerrar sesión |
/auth/dashboard/ |
dashboard |
Panel del usuario |
/auth/edit-profile/ |
edit_profile |
Editar perfil y avatar |
/auth/change-password/ |
change_password |
Cambiar contraseña |
/auth/password-reset/ |
password_reset |
Recuperar contraseña por email |
| Ruta | Nombre | Descripción |
|---|---|---|
/posts/crear/ |
create_post |
Crear publicación |
/posts/editar/<uuid>/ |
update_post |
Editar publicación |
/posts/eliminar/<uuid>/ |
delete_post |
Eliminar publicación |
/posts/mensajes/ |
inbox |
Bandeja de mensajes |
/posts/enviar/<uuid>/ |
send_message |
Enviar mensaje |
/posts/responder/<uuid>/ |
reply_message |
Responder mensaje |
| Ruta | Descripción |
|---|---|
/admin/ |
Panel de administración Django |
Este proyecto está bajo la licencia MIT.
Hecho con 🐾 y Django





