Django
Tutorial Django: Vistas basadas en clases
Django: Aprende a estructurar vistas basadas en clases para aprovechar la orientación a objetos y optimizar el código.
Aprende Django GRATIS y certifícateEstructura de vistas basadas en clases
Las vistas basadas en clases en Django proporcionan una forma de estructurar las vistas utilizando orientación a objetos. Se definen mediante clases que heredan de clases base proporcionadas por Django, lo que permite reutilizar y extender funcionalidades.
Para crear una vista basada en clases, se define una clase que hereda de View
o de una clase genérica específica, como TemplateView
, ListView
o DetailView
. Estas clases base ofrecen métodos predeterminados para manejar solicitudes HTTP y proporcionar comportamientos comunes.
from django.views import View
from django.http import HttpResponse
class MiVista(View):
def get(self, request, *args, **kwargs):
return HttpResponse('Respuesta a una solicitud GET')
En este ejemplo, MiVista
hereda de View
y define el método get
para manejar solicitudes HTTP GET. El método recibe el objeto request
y puede devolver una respuesta utilizando HttpResponse
o renderizando una plantilla.
Las vistas basadas en clases utilizan métodos que corresponden a los métodos HTTP estándar:
get()
: maneja solicitudes GET.post()
: maneja solicitudes POST.put()
: maneja solicitudes PUT.delete()
: maneja solicitudes DELETE.head()
: maneja solicitudes HEAD.options()
: maneja solicitudes OPTIONS.
Además de los métodos HTTP, se pueden definir métodos auxiliares como dispatch()
, setup()
o get_context_data()
para personalizar el comportamiento de la vista. El método dispatch()
es especialmente importante, ya que gestiona la distribución de la solicitud al método adecuado según el método HTTP.
La estructura general de una vista basada en clases incluye:
- Importación de la clase base adecuada desde
django.views
odjango.views.generic
. - Definición de una nueva clase que hereda de la clase base.
- Implementación de los métodos necesarios para atender las solicitudes.
- Configuración de atributos opcionales para personalizar la vista.
- Mapeo de la vista en el archivo
urls.py
utilizando el métodoas_view()
.
Por ejemplo, una vista que muestra una lista de objetos puede utilizar ListView
:
{# libros.html #}
<ul>
{% for libro in libros %}
<li>{{ libro.titulo }}</li>
{% endfor %}
</ul>
# views.py
from django.views.generic import ListView
from .models import Libro
class ListaLibros(ListView):
model = Libro
template_name = "libros.html"
context_object_name = "libros"
En este caso, ListaProductos
hereda de ListView
y especifica el modelo Producto
. Se define el nombre de la plantilla a renderizar y el nombre del contexto que se pasará a la plantilla. No es necesario implementar métodos adicionales a menos que se desee personalizar el comportamiento.
Al mapear la vista en urls.py
, se utiliza as_view()
para obtener la vista:
from django.urls import path
from .views import ListaLibros
urlpatterns = [
path("libros/", ListaLibros.as_view(), name="Libros"),
]
El uso de as_view()
es esencial, ya que convierte la clase en una vista funcional que Django puede utilizar para manejar las solicitudes.
Las vistas basadas en clases permiten una mayor modularidad y reutilización del código. Al aprovechar la herencia y los métodos proporcionados por las clases base, es posible construir vistas complejas con menos esfuerzo y de manera más organizada.
La estructura de las vistas basadas en clases está diseñada para ser extensible y flexible. Se pueden combinar múltiples mixins para añadir funcionalidades específicas, y se pueden sobrescribir métodos para adaptar el comportamiento según las necesidades de la aplicación.
Generic Views y parámetros comunes
Las Generic Views en Django son vistas predefinidas que proporcionan una funcionalidad común para tareas habituales, como mostrar listas, detalles de objetos, crear, actualizar y eliminar registros. Estas vistas genéricas permiten reducir el código repetitivo y acelerar el desarrollo al reutilizar componentes ya implementados por Django.
Las vistas genéricas se encuentran en el módulo django.views.generic
y se dividen en varias categorías:
- Display views: para mostrar datos, como
ListView
yDetailView
. - Editing views: para crear, actualizar y eliminar objetos, como
CreateView
,UpdateView
yDeleteView
. - Date-based views: para trabajar con datos basados en fechas, como
ArchiveView
yDayArchiveView
.
Uso de ListView
y DetailView
El uso más común de las Generic Views se da con ListView
y DetailView
, que permiten mostrar listas de objetos y detalles de un solo objeto, respectivamente.
Ejemplo de ListView
:
{# libros.html #}
<ul>
{% for libro in page_obj %}
<li>{{ libro.titulo }}</li>
{% endfor %}
</ul>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« primera</a>
<a href="?page={{ page_obj.previous_page_number }}">anterior</a>
{% endif %}
<span class="current">
Página {{ page_obj.number }} de {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">siguiente</a>
<a href="?page={{ page_obj.paginator.num_pages }}">última »</a>
{% endif %}
</span>
</div>
# views.py
from django.views.generic import ListView
from .models import Libro
class ListaLibros(ListView):
model = Libro
template_name = "libros.html"
context_object_name = "libros"
paginate_by = 10
En este ejemplo:
model
: especifica el modelo del cual se obtendrán los datos.template_name
: define la plantilla que se utilizará para renderizar la vista.context_object_name
: establece el nombre de la variable de contexto que contendrá la lista de objetos.paginate_by
: habilita la paginación indicando el número de objetos por página.
Ejemplo de DetailView
:
{# libro.html #}
<h1>{{libro.titulo}}</h1>
# views.py
from django.views.generic import DetailView
from .models import Libro
class LibroDetalle(DetailView):
model = Libro
template_name = 'libro.html'
context_object_name = 'libro'
# urls.py
from django.urls import path
from .views import LibroDetalle
urlpatterns = [
path("libros/<int:pk>", LibroDetalle.as_view(), name="Libro"),
]
Aquí, DetailView
muestra los detalles de un solo objeto. Los parámetros comunes son similares a los de ListView
.
Parámetros comunes en Generic Views
Las Generic Views comparten varios parámetros que permiten personalizar su comportamiento:
model
: define el modelo que se utilizará. Es un atributo obligatorio en la mayoría de las vistas genéricas.template_name
: indica la plantilla a utilizar. Si no se especifica, Django busca una plantilla predeterminada basada en el nombre del modelo y el tipo de vista.context_object_name
: establece el nombre de la variable de contexto para acceder a los datos en la plantilla.queryset
: permite especificar una consulta personalizada en lugar de utilizarmodel.objects.all()
.paginate_by
: habilita la paginación en vistas que manejan listas.
Personalización avanzada con métodos y atributos
Además de los parámetros, las Generic Views pueden personalizarse sobrescribiendo métodos:
get_queryset()
: permite modificar la consulta que devuelve los objetos.get_context_data(**kwargs)
: sirve para añadir datos adicionales al contexto de la plantilla.form_valid(form)
: en vistas basadas en formularios, permite definir acciones adicionales cuando el formulario es válido.get_object()
: en vistas que manejan un solo objeto, permite personalizar cómo se obtiene dicho objeto.
Ejemplo de get_queryset():
class ListaLibros(ListView):
model = Libro
template_name = "libros/lista.html"
context_object_name = "libros"
def get_queryset(self):
categoria = self.request.GET.get("categoria")
if categoria:
return Libro.objects.filter(categoria=categoria)
else:
return Libro.objects.all()
En este caso, get_queryset()
filtra los libros por categoría si se proporciona un parámetro en la solicitud.
Uso de CreateView, UpdateView y DeleteView
Para operaciones de creación, actualización y eliminación, se utilizan CreateView
, UpdateView
y DeleteView
. Estos utilizan formularios simples o basados en modelos para manejar la entrada del usuario.
Ejemplo de CreateView:
{# crear.html #}
<form method="post" action="">
{% csrf_token %}
<h2>Crear Libro</h2>
{% for field in form %}
{% if field.name == 'completed' %}
<p>{{ field.label_tag }}
{{ field }}</p>
{% if field.errors %}
<small class="error">{{ field.errors|striptags }}</small>
{% endif %}
{% else %}
{{ field.label_tag }}
{{ field }}
{% if field.errors %}
<small class="error">{{ field.errors|striptags }}</small>
{% endif %}
{% endif %}
{% endfor %}
<div>
<button>Crear</button>
<a href="../libros">Cancelar</a>
</div>
</form>
# views.py
from django.views.generic import CreateView
from .models import Libro
class LibrosCreateView(CreateView):
model = Libro
template_name = "libros/crear.html"
fields = ["titulo", "descripcion", "autor", "categorias"]
success_url = "../libros/"
Aquí:
fields
: lista de campos del modelo que se incluirán en el formulario.success_url
: URL a la que se redirigirá tras una creación exitosa.
Importancia de as_view()
Al mapear las vistas genéricas en urls.py
, es fundamental utilizar el método as_view()
para convertir la clase en una vista callable.
# urls.py
from django.urls import path
from .views import ListaLibros, LibroDetalle
urlpatterns = [
path("libros/", ListaLibros.as_view(), name="book_list"),
path("libros/<int:id>/", LibroDetalle.as_view(), name="book_detail"),
]
El uso de id
en la URL permite que DetailView
recupere el objeto específico basado en su clave primaria o ID.
Trabajando con context_object_name y template_name
Si no se especifica context_object_name
, Django utiliza nombres predeterminados:
- En
ListView
, el nombre esobject_list
olibro_list
(dependiendo del modelo). - En
DetailView
, el nombre esobject
olibro
.
Definir explícitamente context_object_name
mejora la legibilidad en las plantillas.
Del mismo modo, si no se define template_name
, Django buscará plantillas en rutas predeterminadas, como libros/libro_list.html
o libros/libro_detail.html
, siguiendo el patrón <app>/<model>_<viewtype>.html
.
Paginación con paginate_by
La paginación es esencial para manejar listas extensas. Al establecer paginate_by
, Django divide la lista en páginas.
En la plantilla, se puede acceder al objeto paginator
y a la lista paginada page_obj
.
Ejemplo en plantilla:
<ul>
{% for libro in libros %}
<li>{{ libro.titulo }}</li>
{% empty %}
<li>No tienes libros.</li>
{% endfor %}
</ul>
<div>
{% if page_obj.has_previous %}
<a href="?page={{ page_obj.previous_page_number }}">Anterior</a>
{% endif %}
<span>Página {{ page_obj.number }} de {{ page_obj.paginator.num_pages }}</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">Siguiente</a>
{% endif %}
</div>
get_context_data() para añadir información al contexto
Para añadir más datos al contexto, se puede sobrescribir get_context_data()
:
class ListaLibros(ListView):
model = Libro
#...
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['categorias'] = Categoria.objects.all()
return context
Así, en la plantilla, se puede acceder a categorías y mostrarlas al usuario.
Uso de querysets personalizados con get_queryset()
Si se requiere un filtrado más complejo, get_queryset()
es la opción adecuada:
class ListaLibros(ListView):
model = Libro
# ...
def get_queryset(self):
qs = super().get_queryset()
return qs.filter(leido=False)
Este ejemplo filtra los libros que están disponibles.
Resumen de parámetros comunes
model
: Modelo asociado a la vista.queryset
: Conjunto de datos personalizado.template_name
: Ruta de la plantilla a utilizar.context_object_name
: Nombre de la variable de contexto.paginate_by
: Número de objetos por página.form_class
: Clase de formulario a utilizar en vistas basadas en formularios.fields
: Lista de campos del modelo para formularios generados automáticamente.success_url
: URL de redirección tras una operación exitosa.
Las Generic Views son una herramienta poderosa que, al ser bien utilizadas, agilizan el desarrollo y mantenimiento de aplicaciones Django, permitiendo centrarse en la lógica específica de negocio y mejorar la calidad del código.
Mixins y personalización
Los mixins en Django son clases que proporcionan funcionalidades reutilizables que pueden ser combinadas con otras clases para extender su comportamiento. En el contexto de las vistas basadas en clases, los mixins permiten añadir funcionalidades específicas sin reescribir código, facilitando la personalización y promoviendo la modularidad.
Uso de mixins predeterminados
Django ofrece una serie de mixins que pueden ser utilizados para añadir características comunes a las vistas. Por ejemplo, el mixin LoginRequiredMixin
de django.contrib.auth.mixins
garantiza que un usuario esté autenticado antes de acceder a una vista:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import ListView
from .models import Libro
class LibrosListView(LoginRequiredMixin, ListView):
model = Libro
template_name = 'libros/lista.html'
context_object_name = 'libros'
En este ejemplo, LoginRequiredMixin
fuerza la autenticación del usuario antes de mostrar la lista de pedidos. Si el usuario no está autenticado, se le redirige a la página de inicio de sesión.
Orden de herencia en mixins
Es importante tener en cuenta el orden de herencia al utilizar mixins. Los mixins deben colocarse a la izquierda de la clase base en la declaración de la clase:
class MiVistaMixin1(MixinA, MixinB, VistaBase):
pass
Este orden garantiza que el método de resolución de orden (MRO) de Python funcione correctamente y que los mixins puedan sobreescribir métodos de la clase base.
Creación de mixins personalizados
Para necesidades específicas, se pueden crear mixins personalizados. Un mixin es simplemente una clase que hereda de object
o de una clase base si es necesario, y define métodos o atributos que se pueden reutilizar.
Ejemplo de mixin personalizado para registrar acciones de usuario:
class LogUsuarioMixin:
def dispatch(self, request, *args, **kwargs):
usuario = request.user
ruta = request.path
# Lógica para registrar la acción del usuario
print(f"Usuario {usuario} accedió a {ruta}")
return super().dispatch(request, *args, **kwargs)
Al incluir este mixin en una vista, se registra cada acceso del usuario a la misma:
class MiVistaConLog(LogUsuarioMixin, View):
def get(self, request, *args, **kwargs):
return HttpResponse('Vista con registro de acceso')
En este caso, el método dispatch()
es sobrescrito para insertar la lógica de registro antes de llamar al método original.
Personalización de vistas genéricas
Los mixins permiten modificar y extender el comportamiento de las vistas genéricas sin modificar su código base. Por ejemplo, si se desea restringir el acceso a una vista basada en un permiso específico, se puede crear un mixin que verifique dicho permiso:
from django.core.exceptions import PermissionDenied
class PermisoRequeridoMixin:
permiso_requerido = None
def dispatch(self, request, *args, **kwargs):
if not request.user.has_perm(self.permiso_requerido):
raise PermissionDenied
return super().dispatch(request, *args, **kwargs)
Al utilizar este mixin, se puede especificar el permiso requerido en cada vista:
class VistaProtegida(PermisoRequeridoMixin, TemplateView):
template_name = 'protegida.html'
permiso_requerido = 'app.ver_pagina_protegida'
De esta forma, la vista VistaProtegida
sólo será accesible para usuarios que tengan el permiso específico.
Mixins con parámetros de configuración
Los mixins pueden utilizar atributos configurables para adaptarse a diferentes escenarios. Por ejemplo, un mixin que envíe correos electrónicos cuando se cree un objeto:
from django.core.mail import send_mail
class EnvioEmailMixin:
email_asunto = ''
email_plantilla = ''
email_destinatarios = []
def form_valid(self, form):
respuesta = super().form_valid(form)
cuerpo = render_to_string(self.email_plantilla, {'objeto': self.object})
send_mail(self.email_asunto, cuerpo, 'noreply@example.com', self.email_destinatarios)
return respuesta
Al utilizar este mixin en una vista de creación:
class CrearContactoView(EnvioEmailMixin, CreateView):
model = Contacto
fields = ['nombre', 'email', 'mensaje']
email_asunto = 'Nuevo contacto recibido'
email_plantilla = 'emails/nuevo_contacto.html'
email_destinatarios = ['soporte@example.com']
success_url = '/gracias/'
Así, cada vez que se cree un nuevo contacto, se enviará un correo electrónico al equipo de soporte.
Mixins y manejo de permisos de acceso
Los mixins son útiles para implementar controles de acceso personalizados. Django proporciona UserPassesTestMixin
, que permite definir una función que verifique una condición:
from django.contrib.auth.mixins import UserPassesTestMixin
class EsAdministradorMixin(UserPassesTestMixin):
def test_func(self):
return self.request.user.is_staff
Este mixin puede ser utilizado para restringir vistas sólo a administradores:
class PanelAdministracionView(EsAdministradorMixin, TemplateView):
template_name = 'admin/panel.html'
Si el usuario no cumple la condición definida en test_func()
, se le redirige o muestra un error de permiso.
Sobrescritura de métodos en vistas
Además de los mixins, la personalización de vistas basadas en clases se logra sobrescribiendo métodos específicos. Algunos métodos comunes son:
dispatch()
: controla el flujo de ejecución de la vista.get_context_data()
: modifica el contexto pasado a la plantilla.get_queryset()
: personaliza el conjunto de datos a mostrar.form_valid()
: añade lógica cuando un formulario es válido.form_invalid()
: gestiona acciones cuando un formulario es inválido.
Ejemplo de sobrescritura de get_context_data()
:
class LibroDetailView(DetailView):
model = Libro
def get_context_data(self, **kwargs):
contexto = super().get_context_data(**kwargs)
contexto['libros_relacionados'] = Libro.objects.filter(categoria=self.object.categoria).exclude(pk=self.object.pk)[:5]
return contexto
En este caso, se añaden artículos relacionados al contexto para mostrarlos en la plantilla.
Combinación de múltiples mixins
Las vistas basadas en clases permiten combinar múltiples mixins para agregar varias funcionalidades. Por ejemplo:
class VistaAvanzada(LoginRequiredMixin, PermisoRequeridoMixin, EnvioEmailMixin, UpdateView):
model = Libro
fields = ['estado']
permiso_requerido = 'pedidos.cambiar_pedido'
email_asunto = 'Estado de su pedido actualizado'
email_plantilla = 'emails/pedido_actualizado.html'
email_destinatarios = []
def form_valid(self, form):
self.email_destinatarios = [self.object.cliente.email]
return super().form_valid(form)
Esta vista:
- Requiere que el usuario esté autenticado.
- Verifica que tenga el permiso necesario.
- Actualiza el estado de un libro pedido.
- Envía un correo electrónico al cliente tras la actualización.
Es fundamental seguir algunas buenas prácticas al usar mixins.
- Responsabilidad única: cada mixin debe tener una responsabilidad clara y única.
- Nombres descriptivos: utilizar nombres que reflejen la funcionalidad del mixin.
- Documentación: incluir comentarios o docstrings que expliquen el propósito y uso del mixin.
- Evitar conflictos: ser consciente del orden de herencia y posibles conflictos entre métodos de los mixins.
El uso de mixins ofrece varias ventajas, tales como:
- Reutilización de código: facilitan la reutilización de funcionalidades comunes.
- Modularidad: promueven un diseño más modular y limpio.
- Flexibilidad: permiten combinar múltiples comportamientos según las necesidades.
- Mantenimiento: simplifican el mantenimiento al tener funcionalidades centralizadas.
Los mixins y la personalización de vistas basadas en clases son herramientas poderosas en Django que permiten construir aplicaciones más robustas y mantenibles. A través de los mixins, es posible añadir funcionalidades reutilizables y combinar comportamientos para satisfacer requerimientos específicos, todo ello siguiendo los principios de la programación orientada a objetos.
Diferencia con vistas basadas en funciones
En Django, las vistas pueden ser implementadas como vistas basadas en funciones o vistas basadas en clases. La principal diferencia radica en la forma en que se estructuran y en las ventajas que ofrecen en términos de flexibilidad y reutilización.
Las vistas basadas en funciones son simplemente funciones de Python que reciben un objeto HttpRequest
y devuelven un HttpResponse
. Estas vistas son directas y fáciles de entender, lo que las hace ideales para funcionalidades sencillas o para quienes se inician en Django.
from django.http import HttpResponse
def saludo(request):
return HttpResponse('Hola, mundo')
En este ejemplo, saludo
es una vista basada en función que devuelve una respuesta simple. La simplicidad es una de las ventajas de este tipo de vistas, ya que permiten una implementación rápida y clara.
Por otro lado, las vistas basadas en clases se estructuran como clases de Python que heredan de clases base proporcionadas por Django. Utilizan los principios de la programación orientada a objetos para reutilizar código y organizar mejor las funcionalidades.
from django.views import View
from django.http import HttpResponse
class SaludoView(View):
def get(self, request, *args, **kwargs):
return HttpResponse('Hola, mundo')
Aquí, SaludoView
es una vista basada en clase que maneja solicitudes GET. Aunque requiere más código que su equivalente en función, ofrece la posibilidad de extender y personalizar su comportamiento mediante herencia y métodos adicionales.
Ventajas de las vistas basadas en funciones
- Simplicidad: Son más sencillas y directas, lo que facilita su comprensión y mantenimiento en casos simples.
- Flexibilidad: Se puede escribir cualquier lógica dentro de la función sin estar atado a la estructura de una clase.
- Menor sobrecarga: No requieren aprender la estructura y métodos de las vistas basadas en clases.
Desventajas de las vistas basadas en funciones
- Reutilización limitada: Dificultan la reutilización de código cuando se requiere funcionalidad similar en múltiples vistas.
- Organización: Pueden volverse desordenadas y difíciles de mantener en aplicaciones grandes.
- Ausencia de mixins: No pueden aprovechar los mixins y clases genéricas que ofrecen funcionalidades adicionales.
Ventajas de las vistas basadas en clases
- Reutilización y extensibilidad: Gracias a la herencia, es posible extender clases existentes y reutilizar código, mejorando la modularidad de la aplicación.
- Estructura clara: Separan la lógica en métodos, lo que facilita la organización y el mantenimiento.
- Uso de mixins y clases genéricas: Permiten combinar funcionalidades mediante mixins y aprovechar las vistas genéricas de Django para tareas comunes.
Desventajas de las vistas basadas en clases
- Complejidad: Tienen una curva de aprendizaje más pronunciada debido a la necesidad de comprender la herencia y los métodos involucrados.
- Verbosidad: Requieren más código y pueden parecer excesivas para funcionalidades simples.
- Depuración: Puede ser más difícil seguir el flujo de ejecución y depurar errores debido a la asignación automática de métodos.
Comparación mediante un ejemplo
Consideremos una vista que muestra una lista de libros. La implementación basada en función sería:
from django.shortcuts import render
from .models import Libro
def lista_libros(request):
libros = Libro.objects.all()
return render(request, "libros/lista.html", {"libros": libros})
La misma vista utilizando una vista basada en clase sería:
from django.views.generic import ListView
from .models import Libros
class LibrosListView(ListView):
model = Libro
template_name = 'libros/lista.html'
context_object_name = 'libros'
En este caso, la versión basada en clase es más concisa y aprovecha la funcionalidad de ListView
para manejar la lista de productos, incluyendo paginación y ordenación si es necesario.
Cuándo usar cada tipo de vista
Vistas basadas en funciones:
- Para funcionalidades simples o específicas que no requieren reutilización.
- Cuando se necesita un control total sobre la lógica de la vista sin la abstracción de una clase.
- En proyectos pequeños o para desarrolladores que prefieren la simplicidad.
Vistas basadas en clases:
- En aplicaciones complejas donde la reutilización y organización del código sean importante.
- Cuando se desea aprovechar las vistas genéricas y mixins de Django para reducir el código repetitivo.
- Si se sigue un enfoque orientado a objetos para mejorar la mantenibilidad.
Integración con decoradores y middleware
Con las vistas basadas en funciones, es común utilizar decoradores para añadir funcionalidades, como @login_required
para restringir el acceso a usuarios autenticados.
from django.contrib.auth.decorators import login_required
@login_required
def perfil_usuario(request):
# Lógica de la vista
pass
En las vistas basadas en clases, se utilizan mixins para lograr el mismo efecto, como LoginRequiredMixin
.
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views import View
class PerfilUsuarioView(LoginRequiredMixin, View):
# Lógica de la vista
pass
Esto demuestra cómo ambas aproximaciones tienen mecanismos para añadir características adicionales, pero mediante enfoques diferentes: decoradores en funciones y mixins en clases.
Desde el punto de vista del rendimiento, no hay diferencias significativas entre ambos tipos de vistas. La elección entre funciones y clases debe basarse en la organización del código y las necesidades del proyecto, más que en cuestiones de eficiencia.
Las vistas basadas en funciones pueden ser más legibles para funcionalidades pequeñas, pero pueden volverse difíciles de mantener a medida que crece la complejidad. Las vistas basadas en clases proporcionan una estructura que ayuda a organizar el código, facilitando su comprensión y mantenimiento en proyectos grandes.
En vistas basadas en funciones, es necesario comprobar el método HTTP manualmente si se desea manejar múltiples métodos en la misma vista.
def procesar_formulario(request):
if request.method == 'POST':
# Procesar datos
pass
else:
# Mostrar formulario
pass
Las vistas basadas en clases permiten definir métodos específicos para cada método HTTP, como get()
y post()
, lo que mejora la claridad y separación de responsabilidades.
class FormularioView(View):
def get(self, request, *args, **kwargs):
# Mostrar formulario
pass
def post(self, request, *args, **kwargs):
# Procesar datos
pass
En última instancia, comprender las diferencias y fortalezas de cada tipo de vista permite tomar decisiones informadas y construir aplicaciones Django más eficientes y mantenibles.
Todas las lecciones de Django
Accede a todas las lecciones de Django y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Django
Introducción Y Entorno
Instalación Y Configuración Django Con Venv
Introducción Y Entorno
Arquitectura De Un Proyecto Django
Introducción Y Entorno
Base De Datos Mysql En Django
Modelos Y Base De Datos
Creación De Modelos
Modelos Y Base De Datos
Asociaciones De Modelos
Modelos Y Base De Datos
Migraciones
Modelos Y Base De Datos
Operaciones Crud Y Consultas
Modelos Y Base De Datos
Enrutamiento Básico
Vistas Y Plantillas
Plantillas Con Django Template Language
Vistas Y Plantillas
Vistas Basadas En Funciones
Vistas Y Plantillas
Vistas Basadas En Clases
Vistas Y Plantillas
Middlewares
Vistas Y Plantillas
Form Vs Modelform
Formularios
Procesamiento De Formularios
Formularios
Subida De Archivos
Formularios
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender la estructura y beneficios de las vistas basadas en clases.
- Implementar vistas empleando clases base de Django.
- Personalizar vistas a través de sobrescritura de métodos y utilización de mixins.
- Configurar URLS y plantillas para un funcionamiento óptimo.
- Mejorar la modularidad y reutilización del código con mixins.