Arquitectura MVC en Django: Diseño Web Escalable

¿Qué es MVC?

MVC (Modelo-Vista-Controlador) es un patrón arquitectónico utilizado para separar la lógica de una aplicación en tres componentes principales:

1Modelo (Model):

Representa la lógica de datos y la estructura de la base de datos. Es responsable de acceder a los datos y realizar operaciones de validación y procesamiento.

Ejemplo:

python
class Post(models.Model):
  title = models.CharField(max_length=100)
  body = models.TextField()
2Vista (View):

Se encarga de la representación visual de los datos. Muestra los datos de la aplicación al usuario, pero no contiene lógica de negocio.

Ejemplo (HTML):

html
<h1>{{ post.title }}</h1>
<p>{{ post.body }}</p>
3Controlador (Controller):

Gestiona la lógica de interacción entre el Modelo y la Vista. Es responsable de recibir las acciones del usuario, actualizando el modelo y seleccionando la vista adecuada para presentar los datos.

Ejemplo (controlador en Python):

python
def post_detail(request, post_id):
  post = Post.objects.get(id=post_id)
  return render(request, 'post_detail.html', {'post': post})

MVC en Django (MTV)


Django sigue el patrón MTV (Modelo-Template-Vista), que es similar al MVC, pero con una ligera variación en los nombres y la estructura:

1Modelo (Model):

Igual que en MVC, el modelo en Django maneja los datos y la lógica de negocio. Define cómo se almacenan los datos y cómo se interactúa con ellos a través del ORM de Django.

Ejemplo:

python
class Post(models.Model):
  title = models.CharField(max_length=100)
  body = models.TextField()
2Plantilla (Template):

En lugar de “Vista”, Django utiliza Plantillas. Son archivos HTML que incluyen placeholders para datos dinámicos que se generan en el servidor y se insertan en la página antes de ser enviada al navegador.

Ejemplo (template post_detail.html):

html
<h1>{{ post.title }}</h1>
<p>{{ post.body }}</p>
3Vista (View):

En Django, las Vistas son funciones o clases que reciben la solicitud HTTP, procesan la lógica de negocio (por ejemplo, consultan la base de datos), y devuelven una respuesta HTTP. Las vistas son responsables de la interacción entre los modelos y las plantillas.

Ejemplo:

python
from django.shortcuts import render
from .models import Post

def post_detail(request, post_id):
  post = Post.objects.get(id=post_id)
  return render(request, 'post_detail.html', {'post': post})

Flujo de Funcionamiento en Django (MTV)


Solicitud HTTP: El usuario realiza una solicitud a la aplicación (por ejemplo, al abrir una URL).

Enrutamiento (URLs): Django utiliza un archivo urls.py para mapear la solicitud a una vista específica.

Vista (View): La vista correspondiente procesa la solicitud, obtiene los datos necesarios del modelo (por ejemplo, consultando la base de datos), y pasa esos datos a una plantilla.

Plantilla (Template): La plantilla genera el HTML con los datos proporcionados por la vista y se lo envía al navegador del usuario.

Respuesta HTTP: El navegador recibe la respuesta y muestra la página web con los datos procesados.

  Diferencias entre MVC y MTV

Aunque Django sigue el patrón MTV, la diferencia principal radica en los nombres de los componentes:

  • Controlador vs Vista: En el patrón MVC, el “Controlador” maneja la lógica de negocio y la interacción con el modelo y la vista. En Django, esto se realiza en las Vistas.

  • Vista vs Plantilla: La “Vista” en MVC es la interfaz de usuario, mientras que en Django, la “Vista” corresponde a la lógica de control y la “Plantilla” es responsable de la presentación visual.

Ejemplo Completo en Django


1. Modelo:

El modelo define la estructura de los datos en Django, mapeándolos a tablas en la base de datos. Aquí creamos un modelo simple para gestionar publicaciones con título y contenido.

python
# models.py
from django.db import models

class Post(models.Model):
  title = models.CharField(max_length=100)
  body = models.TextField()

  def __str__(self):
      return self.title

Vista:

La vista conecta el modelo con las plantillas, procesando datos y enviándolos al navegador. Aquí mostramos una lista de publicaciones almacenadas en la base de datos.

python
# views.py
from django.shortcuts import render
from .models import Post

def post_list(request):
  posts = Post.objects.all()
  return render(request, 'post_list.html', {'posts': posts})

Plantilla (Template):

La plantilla define cómo se presentan los datos al usuario. Aquí mostramos una lista de publicaciones con su título y contenido utilizando el contexto enviado desde la vista.

html
<!-- post_list.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Post List</title>
</head>
<body>
  <h1>Posts</h1>
  <ul>
      {% for post in posts %}
      <li>{{ post.title }} - {{ post.body }}</li>
      {% endfor %}
  </ul>
</body>
</html>

URLs:

Las URLs conectan las solicitudes del usuario con las vistas correspondientes. Aquí definimos la ruta para mostrar la lista de publicaciones.

python
# urls.py
from django.urls import path
from . import views

urlpatterns = [
  path('posts/', views.post_list, name='post_list'),
]
  Conclusión

El patrón MVC y su implementación en Django (MTV) permiten una separación clara de responsabilidades en el desarrollo de aplicaciones web. El Modelo maneja los datos, la Vista (o Plantilla) se encarga de la presentación y la Vista en Django maneja la lógica de negocio. Este enfoque facilita la escalabilidad y el mantenimiento del código a medida que el proyecto crece.