Quiero saber la principal diferencia entre self.request.user
(cuando se usa la vista genérica View ) y request.user
(cuando se usa una vista definida por el usuario), a veces cuando uso la vista genérica de django ( django.views.generic import View
) que tiene acceso al modelo de usuario de django, interactuaría con el usuario autenticado como request.user
y self.request.user
sin tener ningún problema.
Por ejemplo, en django views.py :
from django.contrib.auth import get_user_model User = get_user_model() class GetUserView(View): def get (self, request, *args, **kwargs): user_qs = User.objects.filter(username=request.user.username) #Do some other stuffs here class AnotherGetUserView(View): def get(self, request, *args, **kwargs): user_qs = User.objects.filter(username=self.request.user.username) #Do some other stuffs here
Me doy cuenta de que los dos conjuntos de consultas funcionan bien, pero aún no puedo descubrir cuál es el mejor para usar.
No hay diferencia. Antes de activar el método get
, ejecutará el .setup(…)
[Django-doc] que establecerá self.request = request
así como self.args
y self.kwargs
en los parámetros de URL posicionales y con nombre respectivamente. A menos que anule esto, self.request
siempre se referirá al mismo objeto que request
, y la documentación dice explícitamente que no debe anular el .setup(…)
sin hacer una llamada al método super que, por lo tanto, se configurará a self.request
Sin embargo, no tiene mucho sentido hacer User.objects.filter(username=request.user.username)
: ya tiene el objeto de usuario: que es request.user
, por lo que aquí solo realizará solicitudes de base de datos adicionales. user_qs
es simplemente un conjunto de consultas con un elemento: request.user
. Por lo tanto, puede, por ejemplo, utilizar request.user.email
para obtener la dirección de correo electrónico del usuario que ha iniciado sesión.
Es posible que desee utilizar LoginRequiredMixin
[Django-doc] para asegurarse de que la vista solo se pueda llamar si el usuario ha iniciado sesión, por lo que:
from django.contrib.auth.mixins import LoginRequiredMixin class GetUserView( LoginRequiredMixin , View): def get (self, request, *args, **kwargs): # …