6

我正在使用 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 实例,以便我的装饰器函数可以使用它?

4

1 回答 1

9

对象是在 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)

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

于 2011-04-28T07:31:22.073 回答