如何将请求对象传递给django类视图中的method_decorator?

时间:2018-02-22 12:46:27

标签: python django

我一整天都在努力。

我正在尝试为类视图编写自定义权限,以检查用户是否属于某组权限。

def rights_needed(reguest):
  if request.user.groups.filter(Q(name='Admin')).exists():
    pass
  else:
    return HttpResponseRedirect('/account/log-in/')

@method_decorator(rights_needed, name='dispatch')
class AdminView(CreateView):
    model = Admin
    form_class = AdminForm
    def get_template_names(self):
        return 'clinic/visitform_list.html'

可以帮助我知道如何实现这一目标吗?或者更简单的方法呢?

我也试过这个(AdminView类中的代码):

    def dispatch(self, request):
        if request.user.groups.filter(Q(name='Admin')).exists():
            return super().dispatch(*args, **kwargs)
        else:
            return HttpResponseRedirect('/account/log-in/')

1 个答案:

答案 0 :(得分:2)

装饰器是一个函数,它接受一个函数(在这种情况下是一个视图),并返回另一个函数(在这种情况下是一个视图)。目前你的rights_needed看起来像一个常规视图 - 它返回的是一个响应,而不是一个函数。

Django附带了user_passes_test方法,可以轻松创建这样的装饰器。由于您使用的是基于类的视图,因此使用UserPassesTest mixin会更容易。

mixin的测试功能是:

def test_func(self):
    return self.request.user.groups.filter(Q(name='Admin')).exists()