在基于类的通用视图中访问用户

时间:2011-08-21 14:28:29

标签: django firefox django-generic-views django-authentication

我正在尝试检查user.is_authenticated()user.has_perm(),但似乎无法扩展基于类的基于视图的基本视图。我找到request出现的唯一方法是get()

class MyDetailView(DetailView):
    def get(self, request, **kwargs):
        import pdb
        pdb.set_trace()
        self.object = self.get_object()
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)

我发现request.userAnonymusClass的实例,无论我是否登录。

(Pdb) request.user.__class__
<class 'django.contrib.auth.models.AnonymousUser'>

因此检查身份验证或烫发将始终失败:

(Pdb) self.request.user.is_authenticated()
False

我已尝试覆盖其他方法,例如get_object()get_context_data()和其他方法。我每个人都有self.request属性可用,但user仍然是Anonymus

所以我的问题是:我应该如何检查用户是否使用基于类的视图登录?

这是否意味着我必须(回去)使用基于功能的视图?

我正在使用Python 2.7.1+Django version 1.4 pre-alpha SVN-16627




回应EVIAAC帖子: 使用login_requiredpermissions_required装饰器不是一种选择。我需要在检索对象后检查权限/登录:如果对象的布尔字段registration_required设置为True,则只有重新注册的用户才能看到该页面,其他用户将被重定向到登录页面(例如从django.contrib.flatpages)借来的行为。

3 个答案:

答案 0 :(得分:2)

在1.3中正常工作:

class TestView(DetailView):
    def get(self, request, **kwargs):
        import ipdb; ipdb.set_trace()

ipdb> request.user
<User: zk>
ipdb> request.user.is_authenticated()
True

可能是个错误?

答案 1 :(得分:1)

尝试使用django.contrib.auth.decorators中的装饰器。在urls.py中,您可以执行以下操作:

from django.contrib.auth.decorators import login_required

...
url(r'^something/?$', login_required(MyDetailView.as_view()))
...

要检查权限,您可以使用premissions_required装饰器。有关详细信息,请查看文档:{​​{3}}

答案 2 :(得分:0)

我将mixins用于基于类的视图。在这种情况下,您可以这样做:

Django Class-Based Generic Views and Authentication