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

15 投票
4 回答
26915 浏览
提问于 2025-05-10 15:49

我在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'  

当我访问这个网址时,看到的错误是:name 'self' is not defined

如果我把self.request.user改成request.user,错误变成了:name 'request' is not defined

注意,如果不进行用户过滤,这个视图是可以正常工作的,并且可以显示数据。使用的是Django 1.8.5版本。

相关文章:

  • 暂无相关问题
暂无标签

4 个回答

0

我会尝试在 __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)
0

我觉得在基于类的视图中,你需要重写 get_queryset() 这个方法,这样才能访问到和视图实例关联的 self.request 对象,而不是在类的层面上去做。关于这个内容,Classy Class-Based Views 网站上有更多信息:http://ccbv.co.uk/projects/Django/1.8/django.views.generic.list/ListView/

6

@pythad的回答是对的。不过在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)
21

你可以直接重写 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)

另外你不能在类上使用装饰器,所以你需要写成这样:

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)

撰写回答