【问题标题】:Accessing user in Class-based generic views在基于类的通用视图中访问用户
【发布时间】:2011-10-31 14:47:26
【问题描述】:

我正在尝试检查是 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() 和其他方法。我每个人都有self.request 属性可用,但user 仍然是Anonymus

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

这是否意味着我必须(返回并)使用基于函数的视图?

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




回应 EVIAAC 帖子: 不能使用 login_requiredpermissions_required 装饰器。检索对象后,我需要检查权限/登录:如果对象的布尔字段 registration_required 设置为 True,则只有请求的用户才能看到该页面,其他用户将被重定向到登录页面(从 @ 借用的示例行为987654341@).

【问题讨论】:

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


    【解决方案1】:

    在 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
    

    可能是一个错误?

    【讨论】:

    • 那一定是别的东西。我已经使用 django 1.3 创建了带有 testapp 的 testproject 和带有 testview 的 testmodel,它仍然是相同的结果。也许我缺少一些东西。能否请您发布完整的测试代码?
    • 这是完整的代码。唯一缺少的是 urlconf,正如您所期望的那样:url(r'^test', TestView.as_view())
    • 看来这个错误只在使用 firefox 时才会出现,这很奇怪。 ://
    • 还签入了另一个 1.3 项目,不知道你做错了什么。
    • 我也使用 Firefox,但没有看到这种行为。
    【解决方案2】:

    尝试使用来自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

    【讨论】:

    • 不能使用 login_requiredpermissions_required 装饰器。检索对象后,我需要检查权限/登录:如果对象的布尔字段 registration_required 设置为 True 只有请求用户才能看到该页面,其他用户将被重定向到登录页面(来自 @987654330 的示例行为@)。
    • 啊。在这种情况下,我建议您编写自己的视图,因为它们似乎需要更具体的行为。试图将这种行为硬塞到通用视图中是没有意义的。
    • 通用视图没有错。问题出现在基于类的视图中,在基于函数的通用视图中它工作得很好。由于 django 引入了基于类的 [通用] 视图,因此使用它们似乎是合适的。
    【解决方案3】:

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

    Django Class-Based Generic Views and Authentication

    【讨论】:

      猜你喜欢
      • 2012-04-27
      • 2014-10-12
      • 1970-01-01
      • 2016-02-21
      • 2011-08-14
      • 2021-05-16
      • 2011-09-19
      • 1970-01-01
      • 2011-11-10
      相关资源
      最近更新 更多