3

我试图检查是否user.is_authenticated()user.has_perm(),但似乎不可能扩展django基于类的通用视图。我发现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() ADN别人。我每个人都有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借用的行为)。

回答

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 

可能是一个错误吗?

+0

这一定是别的。我创建了测试项目testapp与testmodel与testview使用django 1.3,它仍然是相同的结果。也许有一些我错过了。你能不能发布完整的测试代码? – seler

+0

这是完整的代码。唯一缺少的是urlconf,正如你所期望的那样:'url(r'^ test',TestView.as_view())' – zeekay

+0

看来这个bug只存在于使用firefox,这很奇怪。 :/ – seler

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装饰。欲了解更多信息,请查看文档:https://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator

+0

:在这种情况下,你能做到这样。我需要在检索对象后检查权限/登录:如果对象的布尔字段'registration_required'设置为'True',则只有被请求的用户才能看到该页面,其他人将被重定向到登录页面(来自'django的示例行为.contrib.flatpages')。 – seler

+0

啊。在这种情况下,我建议你写自己的观点,因为他们似乎需要更具体的行为。试图将这种行为强化为一般观点毫无意义。 – Drekembe

+0

通用视图没有错。该问题出现在基于类的视图中,在基于函数的通用视图中它完美地工作。由于django引入了基于类的[通用]视图,因此使用它们似乎是正确的。 – seler

相关问题