2012-04-26 23 views
13

多くの私のビューの文脈に同じ追加変数を追加しなければならないことが常にあります。一般的なget_context_dataのための汎用ビュークラスの拡張

def get_context_data(self, **kwargs): 
    # Call the base implementation first to get a context 
    context = super(MyListView, self).get_context_data(**kwargs) 
    # Add in the house 
    context['house'] = self.get_object().house 
    return context 

私は自分自身を繰り返したくないので、私はビューを拡張する新しいクラスを作成することができ、その後、私は新しい拡張ビュークラスにすべての私の意見をベースに考えていました。つまり、CreateView、UpdateView、ListView、DeleteViewの4種類のビューがあります。私は本当にそれらのそれぞれのための新しいクラスを作成する必要がありますか?

Djangoの "基本"ビュークラスのようなものはありませんか?これを行うよりスマートな方法でしょうか?事前に多くの感謝!

+0

私はそれにすべてが夢中だかわからないが、これは潜在的な解決策である - http://reinout.vanrees.org/weblog/2014/05/19/context.html – rix

答えて

19

はミックスインを作成します。

from django.views.generic.base import ContextMixin 

class HouseMixin(ContextMixin): 
    def get_house(self): 
    # Get the house somehow 
    return house 

    def get_context_data(self, **kwargs): 
    ctx = super(HouseMixin, self).get_context_data(**kwargs) 
    ctx['house'] = self.get_house() 
    return ctx 

は、その後、あなたの他のクラスでは、あなたは多重継承を使用したい:

class HouseEditView(HouseMixin, UpdateView): 
    pass 

class HouseListView(HouseMixin, ListView): 
    pass 

をというように、すべてのこれらのビューは、コンテキスト内houseを持つことになります。

+3

うわー、これは実際に働いていました! HouseMixinのスーパーはオブジェクトであり、オブジェクトはget_context_dataを定義していないので、super(HouseMixin、self).get_context_data(** kwargs)はエラーを返します。それがなぜ機能するのか私に説明できますか? – Clash

+3

親クラスの1つがメソッドを実装している限り動作します。存在しない場合、エラーが発生します。ですから、このmixinは、.get_context_data()を実装しているDjangoビューと混在するように設計されています。 –

+1

これは、クラスが拡張される順序と関係がありますか?つまりHouseMixin、UpdateViewの代わりにUpdateView、HouseMixin – Clash

関連する問題