2011-04-28 63 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

相關問題