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) 

당신이 장식에 충실하려는 경우, 당신은 인수에 따라, 당신의 장식 내 데이터베이스에서 개체를 가져 오지에 (ID 또는 슬러그)를해야합니다 볼 수 있습니다. 하지만 데이터베이스에서 두 번, 처음에는 데코레이터에서, 그리고 뷰 내에서 오브젝트를 검색하게 될 것입니다.

+0

도움 주셔서 감사합니다! :) – Asterism

+0

'request.user' 대신'self.request.user'를 사용해야하는 이유를 말씀해 주시겠습니까? 나는'request.user'로 코드를 시도했는데 효과가 있었지만 우연인지는 알 수 없습니다. – Asterism

+1

네, 메소드에 매개 변수로 전달되기 때문에'request.user'를 사용할 수 있습니다. 나는 단지 그것을 알아 차리지 못했다. 일반적으로 클래스 기반 뷰에서 메소드를 대체 할 때 매개 변수로 요청을 얻지 못합니다 ('get_context_data','get_query_set','get_object' 등의 메소드). –

관련 문제