2012-04-26 2 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 

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

Не существует ли что-то вроде класса «базового» класса 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

Ничего себе, это действительно сработало! Я думал, что super (HouseMixin, self) .get_context_data (** kwargs) вернет ошибку, потому что супер HouseMixin является объектом, а объект не определил get_context_data. Можете ли вы объяснить мне, почему это работает? – Clash

+3

Он работает до тех пор, пока один из родительских классов реализует этот метод, если он его не сделал, он вызовет ошибку. Таким образом, этот mixin предназначен для смешивания с любым представлением Django, которое также реализует .get_context_data(). –

+1

Это связано с тем, что классы расширены? т.е. HouseMixin, UpdateView вместо UpdateView, HouseMixin – Clash