Django CBV与自定义装饰

时间:2015-01-26 16:14:42

标签: python django permissions decorator

我正在尝试根据员工的工作地点创建自定义访问权限。例如,如果他们在诊所A工作,他们只能查看/添加/修改该诊所A的数据。但如果他们是该区的所有人,他们可以访问该区的所有诊所。它在函数库视图上工作正常,但它在类基本视图上杀了我。到目前为止我的代码如下:

def restrict_klinik(function):
def wrapper(request,slug, *args, **kw):
    klinikslug = request.user.letakstaf_set.filter(klinik__slug=slug).count()
    retenslug = Reten.objects.filter(slug=slug).count()
    rejectslug = Reject.objects.filter(slug=slug).count()

    if klinikslug == 1 or retenslug == 1 or rejectslug == 1:
        return function(request, slug, *args, **kw)

    messages.error(request, 'Sorry, You dont have access.') 
    return HttpResponseRedirect(reverse_lazy('home'))
return wrapper

class RestrictKlinikMixin(views.LoginRequiredMixin):
    @method_decorator(restrict_klinik)
    def dispatch(self, *args, **kwargs):
        return super(RestrictKlinikMixin, self).dispatch(*args, **kwargs)

我正在使用@restrict_klinik作为我的函数库视图,但是在使用类基本视图时遇到了问题,例如:

类AddClinic(RestrictKlinikMixin,generic.CreateView):

它会抛出'slug'错误。 有任何想法吗?谢谢!

更新:  显然我的一个观点是使用kwargs ['slug']而不是self.kwargs ['slug']。有趣的是,我唯一改变的是在我的观点中添加新的mixin。浪费了4个小时来计算这个,因为它只使用kwargs ['slug']已经工作了1个月。

1 个答案:

答案 0 :(得分:0)

显然我的一个观点是使用kwargs [' slug']而不是self.kwargs [' slug']。有趣的是,我唯一改变的是在我的观点中添加新的mixin。浪费了4个小时来计算这个,因为它只使用了kwargs [' slug']已经工作了1个月。