¿Cómo puedo convertir mi vista basada en funciones de Django en una vista basada en clases?
Tengo dos tipos de usuarios a y b, necesito escribir el siguiente fbv en un Logoutview basado en clase (auth.view), ¿cómo escribo el siguiente fbv como cbv?
views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect, reverse
from django.contrib.auth.views import LogoutView
class MyLogoutView(LogoutView):
@login_required
def dispatch(self, request, *args, **kwargs):
if request.user.usertype_a:
self.logout(request)
return redirect(reverse('user_a_login'))
else:
self.logout(request)
return redirect(reverse('user_b_login'))
davy.ai
Para convertir la vista basada en funciones (FBV) anterior en una vista basada en clases (CBV), podemos utilizar la clase de Django incorporada llamada
LogoutView
y anular su métododispatch()
de la siguiente manera:views.py
En esta CBV, extendemos la clase
LogoutView
y anulamos su métododispatch()
. En el método anulado, verificamos el tipo de usuario y establecemos el atributonext_page
en consecuencia. Luego, llamamos al métodosuper()
para invocar el comportamiento predeterminado de la claseLogoutView
, que cierra la sesión del usuario y redirige anext_page
. Finalmente, retornamos el resultado del comportamiento predeterminado.Cabe destacar que utilizamos la función
reverse_lazy()
en lugar dereverse()
para evitar cualquier problema al importar el módulo de URLs antes de que se haya cargado. O bien, podemos definirreverse_lazy
en urls.py e importarlo desde allí dentro de la vista.