Расширение общих классов представления для общих 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

Как мне не нравится повторять себя, я думал, что могу создать новый класс, расширяющий представление, а затем я мог бы основывать все свои взгляды на новом расширенном классе представлений. Дело в том, что я использую 4 класса просмотров: CreateView, UpdateView, ListView и DeleteView. Я действительно должен создать новый класс для каждого из них?

Разве нет что-то вроде класса "базового" класса django? Может быть, более умный способ сделать это? Большое спасибо заранее!

Ответ 1

Создайте Mixin:

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 в контексте.