I want to know the major difference between
self.request.user (when using generic view View) and
request.user (when using a user defined view), at times when I use django's generic View (
django.views.generic import View) which has access to the django User model, I'd interact with the authenticated user as
self.request.user without having any problem.
For instance, in a 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
I realize that the two queryset works fine but I can't still figure out the best to use.
There is no difference. Before triggering the
get method, it will run the
.setup(…) method [Django-doc] which will set
self.request = request as well as
self.kwargs to the positional and named URL parameters respectively. Unless you override this,
self.request will thus always refer to the same object as
request, and the documentation explicitly says that you should not override the
.setup(…) method without making a call to the super method which will thus set
It however does not make much sense to do
User.objects.filter(username=request.user.username): you already have the user object: that is
request.user, so here you will only make extra database requests.
user_qs is simply a queryset with one element:
request.user. You can thus for example use
request.user.email to obtain the email address of the logged in user.
You might want to use the
LoginRequiredMixin [Django-doc] to ensure that the view can only be called if the user has been logged in, so:
from django.contrib.auth.mixins import LoginRequiredMixin class GetUserView(LoginRequiredMixin, View): def get (self, request, *args, **kwargs): # …