es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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'))
Tags:  , , ,

Answer

  1. Avatar for 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étodo dispatch() de la siguiente manera:

    views.py

    from django.contrib.auth.views import LogoutView
    from django.urls import reverse_lazy
    
    class UserTypeLogoutView(LogoutView):
    
        def dispatch(self, request, *args, **kwargs):
            if request.user.user_type == 'A':
                self.next_page = reverse_lazy('user_a_login')
            else:
                self.next_page = reverse_lazy('user_b_login')
            return super().dispatch(request, *args, **kwargs)
    

    En esta CBV, extendemos la clase LogoutView y anulamos su método dispatch(). En el método anulado, verificamos el tipo de usuario y establecemos el atributo next_page en consecuencia. Luego, llamamos al método super() para invocar el comportamiento predeterminado de la clase LogoutView, que cierra la sesión del usuario y redirige a next_page. Finalmente, retornamos el resultado del comportamiento predeterminado.

    Cabe destacar que utilizamos la función reverse_lazy() en lugar de reverse() para evitar cualquier problema al importar el módulo de URLs antes de que se haya cargado. O bien, podemos definir reverse_lazy en urls.py e importarlo desde allí dentro de la vista.

Comments are closed.