2011-08-20 2 views
1

장고의 클래스 기반 뷰를 실험 해본 결과 request의 특정 정보를 처리하는 간단한 클래스 기반 뷰를 작성하여 "처리기"메소드에서 처리 된 정보를 사용할 수 있도록했습니다.클래스 기반보기를 사용하여 정보를 처리 하시겠습니까?

필자는 문서가 무엇을 말하는지 완전히 이해하지 못했고 이것이 믹스 인, 일반적인보기 또는 다른 것이어야하는지 확신 할 수 없습니다. 내가 만드는 생각하고이 같은 클래스 :

class MyViewDoesRealWork(MyNewGenericView): 
    def get(self, request, some_info): 
     return render(request, 'some_template.html', 
      {'info':self.useful_information1}) 

    def post(self, request, some_info): 
     # Store some information, maybe using get_extra_info 
     return render(request, 'some_template.html', 
      {'info':self.useful_information1}) 

위의 코드 갈 올바른 방법입니다 :이 사람이 같은 뷰를 작성할 수 있습니다

class MyNewGenericView(View): 

    redirect_on_error = 'home' 
    error_message = 'There was an error doing XYZ' 

    def dispatch(self, request, *args, **kwargs): 
     try: 
      self.process_information(request) 
      # self.process_information2(request) 
      # self.process_information3(request) 
      # etc... 
     except ValueError: 
      messages.error(request, self.error_message) 
      return redirect(self.redirect_on_error) 
     return super(MyNewGenericView, self).dispatch(request, *args, **kwargs) 

    def process_information(self, request): 
     # Use get/post information and process it using 
     # different models, APIs, etc. 
     self.useful_information1 = 'abc' 
     self.useful_information2 = 'xyz' 

    def get_extra_info(self): 
     # Get some extra information on something 
     return {'foo':'bar'} 

? 이 일을 더 간단하게/더 나은 방법이 있습니까? 이로 인해 위의 기능이 다른 일반보기 (예 : 기본 제공 일반보기)에서 사용되는 것을 방지 할 수 있습니까?

답변

0

방금 ​​바보 같은 질문을 한 것 같습니다. 이전 스타일 기능 뷰 또는 새로운 클래스 기반의 뷰 사용

다음
class ProcessFooInformation(object): 
    def __init__(self, request): 
     self.request = request 
    @property 
    def bar(self): 
     baz = self.request.GET.get('baz', '') 
     # do something cool to baz and store it in foobar 
     return foobar 
    # etc... 

:

def my_view(request): 
    foo = ProcessFooInformation(request) 
    # use foo in whatever way and return a response 
    return render(request, 'foobar.html', {'foo':foo}) 

을 나는이 이상으로

쉽게 해당 정보를 처리하는 클래스를함으로써 달성 될 수있다 lazy 속성의 평가를 사용하여 효율적입니다.

def lazy_prop(func): 
    def wrap(self, *args, **kwargs): 
     if not func.__name__ in self.__dict__: 
      self.__dict__[func.__name__] = func(self, *args, **kwargs) 
     return self.__dict__[func.__name__] 
    return property(wrap) 

이 예를 당 한 번만 포장 방법의 가치를 평가하고 후속 호출에 저장된 값을 사용

나는 래퍼를 작성하는 lazy property evaluation recipe 및 의견에서 아이디어를 채택. 속성이 느리게 평가되는 경우 유용합니다.

+0

더 나은 방법이 있다고 생각되면 답변을 게시하십시오. – Umang

0

이것 좀보세요. 훌륭한 예제 코드. http://www.stereoplex.com/blog/get-and-post-handling-in-django-views

+0

나는 내 질문에 답하지 않는다고 생각합니다. 실제 뷰가 일반 뷰를 확장하고 들어오는 정보를 처리 할 수 ​​있도록 클래스 기반 뷰를 사용하려고합니다. 링크 된 게시물은 단순히 GET 및 POST 요청을 두 가지 방법으로 구분합니다. 이는 내가하려는 일이 아닙니다. – Umang

관련 문제