El siguiente artículo es la parte 7 de la serie de exploración de vistas basadas en clases (CBV) de Django, que aborda cómo reutilizar funcionalidades comunes utilizando Mixins, así como la gestión de permisos y la verificación de inicio de sesión de manera eficiente. En el artículo anterior (parte 6), se automatizó la renderización de páginas simples y la redirección con TemplateView
y RedirectView
. Ahora, veremos cómo maximizar la reutilización y escabilidad de las CBV.
¡Haz clic en el enlace de abajo para acceder al artículo anterior!
Cómo utilizar TemplateView & RedirectView
“Aumenta la reutilización del código con Mixins de Django y
implementa de manera simple la verificación de permisos y inicio de sesión.”
1. ¿Por qué son necesarios los Mixins?
Aunque las CBV de Django ofrecen una potente reutilización por sí mismas, ¿qué deben hacer cuando hay funcionalidades comunes requeridas en varias vistas? Por ejemplo, muchas veces se requiere iniciar sesión para acceder a ciertas páginas o que solo los usuarios con permisos específicos puedan acceder. Aquí es donde entra en juego el concepto de Mixin.
Un Mixin es una manera de inyectar métodos o atributos idénticos a varias clases utilizando el concepto de herencia múltiple. En las CBV de Django, al heredar una clase Mixin que implementa funcionalidades específicas en la clase vista, se puede reducir el código redundante y aumentar la mantenibilidad.
Ejemplos clave de uso de Mixins:
- Gestión de permisos: verificar si el usuario que accede a una vista está iniciado sesión o tiene permisos específicos.
- Logica de manejo de formularios: procesamiento de datos común necesario en varios formularios.
- Contexto de plantillas: añadir datos de contexto que deben ser compartidos por todas las vistas.
- Registro: agregar funcionalidades de registro antes y después de la ejecución de una vista específica.
2. Uso representativo de Mixins en Django: LoginRequiredMixin
Uno de los Mixins más comúnmente usados es el LoginRequiredMixin
. Como su nombre indica, su función es forzar que se deba iniciar sesión para acceder a la vista correspondiente.
2.1 Cómo usar LoginRequiredMixin
LoginRequiredMixin
está incluido en el módulo django.contrib.auth.mixins
.
# views.py
from django.views.generic import ListView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Post # Modelo de ejemplo
class MyPostListView(LoginRequiredMixin, ListView):
model = Post
template_name = 'posts/my_posts.html'
context_object_name = 'posts'
# URL a la que se redirigirá si el usuario no está iniciado sesión (opcional)
# login_url = '/accounts/login/' # settings.LOGIN_URL es el valor predeterminado
# redirect_field_name = 'next' # nombre del parámetro de consulta usado para volver a la página original tras iniciar sesión (predeterminado)
- Orden de herencia: Se hereda primero
LoginRequiredMixin
, seguido de la Vista Genérica de Django (en este caso,ListView
). Dado que el Mixin se utiliza principalmente para agregar funcionalidades, es una práctica común colocarla antes de la clase vista principal. LoginRequiredMixin
redirige automáticamente a los usuarios no iniciados a la página de inicio de sesión especificada porsettings.LOGIN_URL
. Si se inicia sesión exitosamente, se vuelve a la página original a través del parámetro de consultanext
.
2.2 Conexión en urls.py
Las vistas con LoginRequiredMixin
se conectan a urls.py
del mismo modo que las CBV normales.
# urls.py
from django.urls import path
from .views import MyPostListView
urlpatterns = [
path('my-posts/', MyPostListView.as_view(), name='my_posts'),
]
Ahora, al acceder a la ruta /my-posts/
, si no se ha iniciado sesión, se será redirigido a la página de inicio de sesión.
3. Mixin para gestión de permisos: PermissionRequiredMixin & UserPassesTestMixin
Si LoginRequiredMixin
obliga a iniciar sesión, PermissionRequiredMixin
y UserPassesTestMixin
solo permiten el acceso si se cumple un permiso específico o se satisface una condición específica.
3.1 Cómo usar PermissionRequiredMixin
Se integra con el sistema de permisos de Django para que solo los usuarios con un permission
específico puedan acceder.
# views.py
from django.views.generic import CreateView
from django.contrib.auth.mixins import PermissionRequiredMixin
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(PermissionRequiredMixin, CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/'
# Especificar el permiso en formato 'app_label.permission_codename'
permission_required = 'app_label.add_article'
# Para permitir cualquier permiso entre varios:
# permission_required = ('app_label.add_article', 'app_label.change_article')
# raise_exception = True # Lanza un error 403 Forbidden si no hay permiso (el valor predeterminado es redirigir a la página de inicio de sesión)
permission_required
: Se especifican los permisos necesarios para el acceso como una cadena (única o una tupla). Se utilizan principalmente los permisos automáticamente generados por el appauth
de Django por modelo (add_model
,change_model
,delete_model
,view_model
).
3.2 Cómo usar UserPassesTestMixin
Se utiliza cuando se quieren comprobar condiciones más complejas o personalizadas. Por ejemplo, permite que solo se puedan modificar los artículos creados por el usuario o solo permite el acceso a usuarios que pertenecen a un grupo específico.
# views.py
from django.views.generic import UpdateView
from django.contrib.auth.mixins import UserPassesTestMixin
from .models import Comment
from .forms import CommentForm
class CommentUpdateView(UserPassesTestMixin, UpdateView):
model = Comment
form_class = CommentForm
template_name = 'comments/comment_form.html'
success_url = '/comments/'
# Sobrescribe el método test_func para verificar la condición
def test_func(self):
comment = self.get_object()
# Verifica si el usuario actualmente conectado es el autor del comentario
return self.request.user == comment.author or self.request.user.is_superuser
# raise_exception = True # Lanza un error 403 Forbidden si la prueba falla
- El método
test_func()
debe ser sobrescrito, y devolver True permite el acceso, mientras que devolver False lo deniega. - Se puede acceder al objeto del usuario actualmente conectado a través de
self.request.user
.
4. Creación de Mixins personalizados
Además de los Mixins proporcionados por Django, puedes crear tu propio Mixin para reutilizar en varias vistas. Por ejemplo, crearemos un Mixin que añade el contexto current_year
que es necesario en todas las páginas.
# common/mixins.py
from datetime import datetime
class CurrentYearMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['current_year'] = datetime.now().year
return context
# views.py (ejemplo de aplicación)
from django.views.generic import TemplateView
from .common.mixins import CurrentYearMixin
class MyCustomPageView(CurrentYearMixin, TemplateView):
template_name = 'my_custom_page.html'
# my_custom_page.html (uso en plantilla)
<footer>© {{ current_year }} Mi Sitio Web</footer>
CurrentYearMixin
sobrescribe el métodoget_context_data
para añadircurrent_year
al contexto. Es importante llamar asuper().get_context_data(**kwargs)
para mantener los datos de contexto de la clase superior (o de otros Mixins).
5. Comparativa con FBV
Funcionalidad | FBV (vistas basadas en funciones) | CBV + Mixin |
Verificación de inicio de sesión/permisos | Uso de decoradores como @login_required , @permission_required . <br> Las condiciones personalizadas se deben escribir directamente en la función, como if not request.user.is_authenticated: return redirect(...) . |
LoginRequiredMixin, PermissionRequiredMixin, UserPassesTestMixin, etc., se aplican fácilmente mediante la herencia de Mixins. <br> Aunque es similar a los decoradores, está más integrado en la estructura CBV. |
Reutilización de código | Logicas comunes se separan en funciones o se escriben decoradores de función por separado. <br> Es fácil que se genere código redundante. | A través de Mixins, las funcionalidades necesarias se modularizan e inyectan mediante herencia múltiple. <br> Es mucho más estructurado y reutilizable. |
Legibilidad del código | Cada función puede repetir la lógica de verificación de condiciones. | Solo mirando la lista de herencia de la clase vista, es fácil comprender qué funcionalidades (permisos, inicio de sesión, etc.) se aplican. |
Mantenibilidad | Al agregar nuevas funcionalidades, puede ser necesario modificar muchas funciones. | Con solo modificar la clase Mixin, se podrán aplicar los cambios a todas las vistas que la utilicen. |
Productividad de desarrollo (palabra clave principal) | “Cada función maneja individualmente, posibilidad de repetición de tareas” | “Modularización, fácil expansión de funciones, cumplimiento del principio DRY (No te repitas), aumento de la productividad” |
6. Conclusión y adelanto del próximo artículo
Los Mixins son un elemento clave que permite que las vistas basadas en clases de Django muestren su verdadera potencia. A través de ellos, podemos maximizar la reutilización del código, modularizar las funciones comunes y reducir la complejidad de las clases vistas, implementando de manera muy eficiente elementos esenciales de aplicaciones web como la gestión de autenticación y permisos.
Hasta ahora, hemos examinado casi todos los aspectos clave de las CBV, desde los usos básicos hasta los CRUD complejos, y la expansión de funcionalidades a través de Mixins.
En la próxima entrega (parte 8 de la serie), veremos cómo aplicar las CBV que hemos tratado a proyectos reales, cómo combinarlas en escenarios complejos, y haremos un resumen integral de las ventajas y limitaciones de las CBV.
Revisar el artículo anterior
- Explorando la serie de vistas basadas en clases (CBV) #1 – Razones para pasar de FBV a CBV y la mentalidad del desarrollador
- Explorando la serie de vistas basadas en clases (CBV) #2 – Entendiendo la clase de Vista básica de Django
- Explorando la serie de vistas basadas en clases (CBV) #3 – Facilitar el procesamiento de formularios con FormView
- Explorando la serie de vistas basadas en clases (CBV) #4 – Cómo utilizar ListView & DetailView
- Explorando la serie de vistas basadas en clases (CBV) #5 – Implementación del CRUD con CreateView, UpdateView, DeleteView
- Explorando la serie de vistas basadas en clases (CBV) #6 – Cómo utilizar TemplateView & RedirectView
“Aprovecha al máximo el potencial de Django CBV con Mixins y
construye aplicaciones web que sean fáciles de mantener y expandir.”
No hay comentarios.