2011-08-20 12 views
1

私はDjangoのクラスベースのビューを試していました。処理された情報を "ハンドラ"メソッドで使用できるように、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 property evaluation recipeからのアイデアやコメントを適応:

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) 

これは、一度だけインスタンスごとに包まれた方法の価値を評価し、後続の呼び出しに格納された値を使用しています。これは、プロパティの評価が遅い場合に便利です。

+0

もっと良い方法があると思われる場合は、回答を投稿してください。 – Umang

0

これを見てください。素晴らしいサンプルコード。 http://www.stereoplex.com/blog/get-and-post-handling-in-django-views

+0

私は私の質問に答えるとは思わない。私は実際のビューが一般的なビューを拡張し、受け取った情報をそれらのために処理できるように、クラスベースのビューを使用しようとしています。あなたがリンクした投稿は、GETリクエストとPOSTリクエストを2つの異なるメソッドに分けるだけです。これは私がやろうとしているものではありません。 – Umang

関連する問題