简体   繁体   English

如何在基于Django类的视图中访问当前用户

[英]How to access current user in Django class based view

I cannot access current logged in user in Django class based view: 我无法在基于Django类的视图中访问当前登录的用户:

models.py: models.py:

class Userproject(models.Model):
class Meta:
    verbose_name = u'pp'
    verbose_name_plural = u'pps'

user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="project", verbose_name=_("Владелец проекта"))
#user = models.ForeignKey(User, unique=True)

name = models.TextField(u'Название проекта', unique=True)
date_created = models.DateTimeField(u'Дата создания', default=datetime.now(), db_index=True)
date_until = models.DateTimeField(u'Оплачен по', default=datetime.now(), db_index=True)

views.py: views.py:

@login_required
class UserprojectList(ListView):
    context_object_name = 'userproject_list'
    queryset = Userproject.objects.filter(user=self.request.user)
    template_name = 'userproject_list.html'  

when i navigate to url i see error: name 'self' is not defined 当我导航到url时,我看到错误: 名称'self'未定义

if i change self.request.user to request.user the error is: name 'request' is not defined 如果我将self.request.user更改为request.user,则错误为:name'request '未定义

Note that without user filtering view is working and shows data django 1.8.5 请注意,没有用户过滤视图正在工作并显示数据django 1.8.5

You can just overwrite get_queryset : 你可以覆盖get_queryset

@login_required
class UserprojectList(ListView):
    context_object_name = 'userproject_list'
    template_name = 'userproject_list.html'
    def get_queryset(self):
        return Userproject.objects.filter(user=self.request.user)

Also you can't use decorators on classes , so you have to write something like this: 你也不能在类上使用装饰器 ,所以你必须写这样的东西:

from django.utils.decorators import method_decorator

class UserprojectList(ListView):
    context_object_name = 'userproject_list'
    template_name = 'userproject_list.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(UserprojectList, self).dispatch(*args, **kwargs)

    def get_queryset(self):
        return Userproject.objects.filter(user=self.request.user)

I would try to do that in the __init__ method: 我会尝试在__init__方法中执行此操作:

@login_required
class UserprojectList(ListView):
    context_object_name = 'userproject_list'
    template_name = 'userproject_list.html'
    def __init__(self, *args, **kwargs):
        super(UserprojectList, self).__init__(*args, **kwargs)
        self.queryset = Userproject.objects.filter(user=self.request.user)

I think in the class-based views you would need to override the get_queryset() method in order to have access to the self.request object attached to the instance of the view rather than do this at the class level. 我认为在基于类的视图中,您需要覆盖get_queryset()方法,以便能够访问附加到视图实例的self.request对象,而不是在类级别执行此操作。 The Classy Class-Based Views site has more information: http://ccbv.co.uk/projects/Django/1.8/django.views.generic.list/ListView/ Classy Class-Based Views网站提供了更多信息: http//ccbv.co.uk/projects/Django/1.8/django.views.generic.list/ListView/

@pythad's answer is correct. @ pythad的回答是正确的。 But on Django 1.9+, instead of the dispatch method, you can use django.contrib.auth.mixins.LoginRequiredMixin to replace the old-style @login_required decorator. 但是在Django 1.9+上,您可以使用django.contrib.auth.mixins.LoginRequiredMixin替换旧式的@login_required装饰器,而不是dispatch方法。

from django.contrib.auth.mixins import LoginRequiredMixin

class UserprojectList(LoginRequiredMixin, ListView):
    context_object_name = 'userproject_list'
    template_name = 'userproject_list.html'

    def get_queryset(self):
        return Userproject.objects.filter(user=self.request.user)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM