2012-03-04 9 views
1

私はDjangoの1.3からの新しいクラスベースのビューの周りに私の頭を歪ませようとしています。Djangoクラスベースのビューをサブクラス化しますか?

私は読書の少しやった:

しかし、私は例を見ていない一つのことを、または実行する方法である、ことができますいくつかのビューは共通の '親'クラスをサブクラス化し、そこからデータを再利用しますか?

に私がやろうとしています何の例を(一般的な命名法の私のスラッシングを恩赦):

class MyParentClass(TemplateView): 
    def get(self, request, *args, **kwargs): 
    session_data = request.session 
    other_variables = foovars 
    return self.render_to_response(context) 

class MyChildClassOne(TemplateView): 
    template_name = "template_one.htm" 

    def get(self,request, *args, **kwargs): 
     resultant_data = foodata 
     return {'data' : resultant_data } 


class MyChildClassTwo(TemplateView): 
    template_name = "template_two.htm" 

    def get(self,request, *args, **kwargs): 
     other_data = foootherdata 
     return {'data' : other_data } 

2つのクラスの唯一の違いは、彼らが使用するテンプレートや「データ」になるように、彼らは戻る。どちらのビューでも、親クラスからsession_dataおよびother_variablesが返されるため、すべての子クラスで "return session_data、other_variables"が繰り返されません。

答えて

1

これは可能な方法です:親クラスは、子クラスによって設定されるコンテキスト内のdataという変数を返します。

例:

class MyParentClass(TemplateView): 
    def get(self, request, *args, **kwargs): 
     session_data = request.session 
     other_variables = foovars 
     context['data'] = data 
     return self.render_to_response(context) 

class MyChildClassOne(MyParentClass): 
    template_name = "template_one.htm" 

    def get(self,request, *args, **kwargs): 
     data = foodata 
     return super(MyChildClassOne, self).get(request, args, kwargs) 


class MyChildClassTwo(MyParentClass): 
    template_name = "template_two.htm" 

    def get(self,request, *args, **kwargs): 
     data = foootherdata 
     return super(MyChildClassTwo, self).get(request, args, kwargs) 

どちらも、あなたの子クラスがそのget方法は、自動的にコンテキストにdataという名前の変数を設定し、MyParentClassから継承します。データ値は、子クラスによって提供されます。終了後、彼らは親のgetメソッドを呼び出して、レンダリングを含む共通の操作を実行します。

2

まず、ビューのgetメソッドをオーバーライドしないでください。それは私がここには行かないいくつかの理由で危険です。

あなたが必要とするのは、get_context_dataメソッドです。このメソッドは、テンプレートに渡されるコンテキストdictを返します。

だから、両方のあなたの子ビューは次のようになります。

class ChildView(ParentView): 
    template_name = "foo" 
    def get_context_data(self, **kwargs): 
     context = super(ChildView, self).get_context_data(**kwargs) 
     context.update({ 
      'foodata': 'bardata', 
     }) 
     return context 

をしかし、これはかなり意見が箱から出して動作する方法です。なぜあなたは追加のカスタムビュークラスからサブクラス化する必要があると思いますか?

関連する問題