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

Vic*_*mer 5 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=_("???????? ???????"))
#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)
Run Code Online (Sandbox Code Playgroud)

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'  
Run Code Online (Sandbox Code Playgroud)

当我导航到url时,我看到错误: 名称'self'未定义

如果我将self.request.user更改为request.user,则错误为:name'request '未定义

请注意,没有用户过滤视图正在工作并显示数据django 1.8.5

pyt*_*had 12

你可以覆盖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)
Run Code Online (Sandbox Code Playgroud)

此外,你不能在类中使用的装饰,所以你必须写是这样的:

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)
Run Code Online (Sandbox Code Playgroud)

  • 这在当时可能不可用,但是你可以继承 `django.contrib.auth.mixins.LoginRequiredMixin` mixin 到你的类中,而不是使用 `@method_decorator(login_required)` 装饰器,这样会更简洁。 (4认同)

Qui*_*que 6

@pythad's answer is correct. 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.

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)
Run Code Online (Sandbox Code Playgroud)