17

多くのビューのコンテキストに、同じ追加の変数を追加しなければならないことが常にあります。

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の「ベース」ビュークラスのようなものはありませんか? これを行うためのよりスマートな方法はありますか?

4

1 に答える 1

21

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

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コンテキストに含まれます。

于 2012-04-26T18:04:03.837 に答える