Proyecto: config_modular_django
App: estructura
mkdir config_modular_django
cd config_modular_djangopython -m venv venv
venv\Scripts\activatepython -m pip install --upgrade pip
pip install djangodjango-admin startproject config_modular_djangocd config_modular_djangopython manage.py helppython manage.py startapp estructurapython manage.py migrateAgregar la app:
INSTALLED_APPS += [
"estructura",
]Configurar templates globales (dentro de TEMPLATES[0]):
"DIRS": [BASE_DIR / "templates"],from django.urls import include, path
urlpatterns += [
path("", include(("estructura.urls", "estructura"), namespace="estructura")),
]from django.urls import path
from . import views
app_name = "estructura"
urlpatterns = [
path("hola/", views.hola, name="hola"),
path("", views.home, name="home"),
path("mvt/", views.mvt, name="mvt"),
]from __future__ import annotations
from django.db import models
class Componente(models.Model):
"""
Modelo mínimo para correlacionar componentes esenciales del proyecto.
"""
nombre = models.CharField(max_length=80)
rol = models.CharField(max_length=40)
class Meta:
verbose_name = "Componente"
verbose_name_plural = "Componentes"
ordering = ["id"]
def __str__(self) -> str:
return f"{self.nombre} ({self.rol})"from __future__ import annotations
from django.http import HttpRequest, HttpResponse
from django.shortcuts import render
from .models import Componente
def hola(_: HttpRequest) -> HttpResponse:
"""
Respuesta directa: confirma routing -> view sin templates.
"""
return HttpResponse("Hola mundo desde estructura (sin template).")
def home(request: HttpRequest) -> HttpResponse:
"""
Home con template base, demostrando URL -> View -> Template.
"""
return render(
request,
"estructura/home.html",
{
"titulo": "Configuración estructural y modular",
},
)
def mvt(request: HttpRequest) -> HttpResponse:
"""
Demostración mínima de MVT: consulta ORM y renderiza lista.
"""
# Seed mínimo: asegura algunos componentes sin depender de comandos extra.
if Componente.objects.count() == 0:
Componente.objects.bulk_create(
[
Componente(nombre="models.py", rol="Modelo"),
Componente(nombre="views.py", rol="Vista"),
Componente(nombre="urls.py", rol="Router"),
Componente(nombre="templates/", rol="Template"),
Componente(nombre="settings.py", rol="Configuración"),
]
)
componentes = Componente.objects.order_by("id")
return render(
request,
"estructura/mvt.html",
{
"titulo": "MVT: Modelo - Vista - Template",
"componentes": componentes,
},
)mkdir templates
mkdir templates\estructura<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>{% block title %}Django Modular{% endblock %}</title>
<style>
body { font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; margin: 0; }
header, main { max-width: 980px; margin: 0 auto; padding: 16px; }
header { border-bottom: 1px solid #e5e7eb; }
nav a { margin-right: 12px; text-decoration: none; }
code { background: #f3f4f6; padding: 2px 6px; border-radius: 6px; }
.card { border: 1px solid #e5e7eb; border-radius: 12px; padding: 12px; margin: 12px 0; }
.muted { color: #6b7280; }
</style>
</head>
<body>
<header>
<div class="muted">Aplicación 2 — Configuración estructural y modular</div>
<h1 style="margin: 8px 0;">{% block h1 %}Django Modular{% endblock %}</h1>
<nav>
<a href="{% url 'estructura:home' %}">Home</a>
<a href="{% url 'estructura:hola' %}">Hola</a>
<a href="{% url 'estructura:mvt' %}">MVT</a>
</nav>
</header>
<main>
{% block content %}{% endblock %}
</main>
</body>
</html>{% extends "base.html" %}
{% block title %}Home | Estructura{% endblock %}
{% block h1 %}Home{% endblock %}
{% block content %}
<div class="card">
<p><strong>{{ titulo }}</strong></p>
<p class="muted">Rutas:</p>
<ul>
<li><code>/hola/</code></li>
<li><code>/mvt/</code></li>
</ul>
</div>
{% endblock %}{% extends "base.html" %}
{% block title %}MVT | Estructura{% endblock %}
{% block h1 %}MVT{% endblock %}
{% block content %}
<div class="card">
<p><strong>{{ titulo }}</strong></p>
<p class="muted">Listado desde ORM:</p>
</div>
<div class="card">
{% if componentes %}
<ul>
{% for c in componentes %}
<li><strong>{{ c.nombre }}</strong> — <span class="muted">{{ c.rol }}</span></li>
{% endfor %}
</ul>
{% else %}
<p class="muted">No hay componentes.</p>
{% endif %}
</div>
{% endblock %}python manage.py makemigrations estructura
python manage.py migratepython manage.py runserverRutas:
http://127.0.0.1:8000/→ Home (template)http://127.0.0.1:8000/hola/→ Hola (HttpResponse directo)http://127.0.0.1:8000/mvt/→ MVT (ORM + template)
python manage.py <comando> --help
python manage.py runserver --help
python manage.py startapp --helpSi al abrir / aparece:
TemplateDoesNotExist: estructura/home.html
dirDebes ver manage.py.
dir templates
dir templates\estructuraDebe existir:
templates\base.htmltemplates\estructura\home.htmltemplates\estructura\mvt.html
python manage.py shellLuego:
from django.conf import settings
settings.TEMPLATES[0]["DIRS"]Debe mostrar una ruta que termina en:
...\config_modular_django\templates
# CTRL + C
python manage.py runserverSi al abrir /mvt/ aparece:
OperationalError: no such table: estructura_componente
Ejecuta:
python manage.py makemigrations estructura
python manage.py migratePara confirmar:
python manage.py showmigrations estructuraPara verificar el funcionamiento del modelo y las vistas de la app estructura:
python manage.py testdeactivatePara levantar este proyecto utilizando Docker, sigue estos pasos:
Necesitarás Docker Desktop instalado y en ejecución en tu sistema.
Desde la raíz del proyecto (donde se encuentra docker-compose.yml), ejecuta:
docker compose up --build -dEste comando:
- Compilará la imagen de Docker usando el
Dockerfileyrequirements.txt. - Ejecutará las migraciones de base de datos automáticamente (
migrate). - Creará de forma segura el superusuario administrador (
admincon la contraseñaadminpassword123) si no existe aún. - Iniciará el servidor de Django en el puerto
8000.
Abre tu navegador en:
- Sitio:
http://127.0.0.1:8000/ - Panel de Administración:
http://127.0.0.1:8000/admin/(Inicia sesión conadminyadminpassword123).
Para apagar el servidor y limpiar los recursos del contenedor:
docker compose downEste proyecto está bajo la Licencia MIT. Para más detalles, consulta el archivo LICENSE en el directorio raíz.