带有自定义装饰器的 Django CBV

Django CBV with custom decorator

我正在尝试根据我的员工工作地点创建自定义访问权限。例如,如果他们在诊所 A 工作,他们只能 view/add/modify 那个诊所 A 的数据。但是如果他们负责那个地区,他们可以访问那个地区的所有诊所。它在函数基础视图上运行良好,但在 class 基础视图上却让我丧命。到目前为止我的代码如下:

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作为我的函数基础视图,但是我在使用class基础视图时遇到了问题,例如:

class 添加诊所(RestrictKlinikMixin,generic.CreateView):

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

更新: 显然我的观点之一使用 kwargs['slug'] 而不是 self.kwargs['slug']。有趣的是,我唯一改变的是在我的视图中添加新的 mixin。浪费了大约 4 个小时来解决这个问题,因为它仅使用 kwargs['slug'].

就可以正常工作 1 个月

显然我的观点之一是使用 kwargs['slug'] 而不是 self.kwargs['slug']。有趣的是,我唯一改变的是在我的视图中添加新的 mixin。浪费了大约 4 个小时来解决这个问题,因为它仅使用 kwargs['slug'].

就可以正常工作 1 个月