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

时间:2011-04-28 07:02:58

标签: 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)

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

1 个答案:

答案 0 :(得分: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)

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