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