在基于Django类的通用视图中访问上下文对象

Ast*_*ism 5 django django-generic-views django-class-based-views

我正在使用DetailView来查看Project对象,我希望能够访问正在查看的Project对象,以便将其传递给装饰器,如下所示:

class ProjectDetailView(DetailView):
    context_object_name = "project"
    model = Project

    @method_decorator(membership_required(project))
    def dispatch(self, *args, **kwargs):
        return super(ProjectDetailView, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

但是,将"project"或"object"传递给装饰器会给我一个"对象",而不是Project实例.如何获取Project实例,以便我的装饰器功能可以使用它?

Iva*_*yan 8

在dispatch()方法中检索对象,因此装饰器无法使用它.您可以检查覆盖的get()方法内的成员资格:

class ProjectDetailView(DetailView):
    context_object_name = "project"
    model = Project

    def get(self, request, **kwargs):
        self.object = self.get_object()
        if not self.object.is_member(self.request.user):
            return HttpResponseRedirect('/') # or something else
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)
Run Code Online (Sandbox Code Playgroud)

如果你想坚持使用装饰器,你必须根据要查看的args(id或slug)从装饰器中的数据库中检索对象.但是,您将从数据库中检索对象两次,首先在装饰器中,然后在视图中.