2011-04-28 109 views
4

我正在使用DetailView来查看Project对象,并且我希望能够访问正在查看的Project对象以便将其传递给装饰器,是这样的:在Django基于类的通用视图中访问上下文对象

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) 

然而,传递“项目”或“对象”的装饰给了我一个“对象”,而不是一个项目实例。我如何获得该项目实例,以便我的装饰器功能可以使用它?

回答

7

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

如果你想坚持的装饰,你必须你的装饰中retrive从数据库对象,基于ARGS(ID或蛞蝓)查看。但是你会从数据库中检索对象两次,首先在装饰器中,然后在视图中。

+0

谢谢你的帮助! :) – Asterism 2011-05-02 02:33:12

+0

你能告诉我为什么我需要使用'self.request.user'而不是'request.user'吗?我用'request.user'试过了代码,它工作正常,但我不知道这是否是巧合。 – Asterism 2011-05-02 05:55:09

+1

是的,你可以使用'request.user',因为它作为参数传递给方法。我只是没有注意到这一点。通常,当我在基于类的视图中覆盖方法时,它们不会将请求作为参数(类似于'get_context_data','get_query_set','get_object'等方法)获取请求。 – 2011-05-03 07:27:07

相关问题