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

Python 如何在基于Django类的视图中访问当前用户,python,django,Python,Django,我无法在基于Django类的视图中访问当前登录用户: 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=_("Владелец проекта"

我无法在基于Django类的视图中访问当前登录用户:

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:

@login_required
class UserprojectList(ListView):
    context_object_name = 'userproject_list'
    queryset = Userproject.objects.filter(user=self.request.user)
    template_name = 'userproject_list.html'  
当我导航到url时,我看到错误: 未定义名称“self”

如果我将self.request.user更改为request.user 错误是:未定义名称“请求”

请注意,如果没有用户筛选,视图将工作并显示数据
django 1.8.5

我会尝试使用
\uuuu init\uuuu
方法:

@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)

我认为在基于类的视图中,您需要重写get_queryset()方法,以便访问附加到视图实例的self.request对象,而不是在类级别执行此操作。基于Classy类的视图网站提供了更多信息:

您可以只覆盖
get\u 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)
另外,您不能在类上使用装饰器,因此您必须编写如下内容:

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)

@毕达德的回答是正确的。但在Django 1.9+上,您可以使用替换旧式@login\u所需的装饰器,而不是
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)

您是否介意显示您的
url.py
?这在当时可能不可用,但是您可以将
@method\u decorator(需要登录)
decorator继承
django.contrib.auth.mixin.LoginRequiredMixin
混合到您的类中,这样更整洁。