MVC (Modelo-Vista-Controlador) es un patrón arquitectónico utilizado para separar la lógica de una aplicación en tres componentes principales:
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:
class Post(models.Model):
title = models.CharField(max_length=100)
body = models.TextField() 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):
<h1>{{ post.title }}</h1>
<p>{{ post.body }}</p> 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):
def post_detail(request, post_id):
post = Post.objects.get(id=post_id)
return render(request, 'post_detail.html', {'post': post}) 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:
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:
class Post(models.Model):
title = models.CharField(max_length=100)
body = models.TextField() 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):
<h1>{{ post.title }}</h1>
<p>{{ post.body }}</p> 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:
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}) 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.
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.
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.
# 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 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.
# 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}) 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.
<!-- 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> Las URLs conectan las solicitudes del usuario con las vistas correspondientes.
Aquí definimos la ruta para mostrar la lista de publicaciones.
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('posts/', views.post_list, name='post_list'),
] 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.