扩展常见get_context_data的通用视图类

Cla*_*ash 15 django django-generic-views

我经常看到自己必须在我的许多视图的上下文中添加相同的额外变量.

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
Run Code Online (Sandbox Code Playgroud)

因为我不喜欢重复自己,我想我可以创建一个扩展视图的新类,然后我可以将所有视图基于新的扩展视图类.问题是,我使用了4类视图:CreateView,UpdateView,ListView和DeleteView.我是否真的必须为其中一个创建一个新类?

是不是像django"基础"视图类?也许更聪明的方法呢?提前谢谢了!

Jj.*_*Jj. 21

创建一个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
Run Code Online (Sandbox Code Playgroud)

然后在其他类中使用多重继承:

class HouseEditView(HouseMixin, UpdateView):
  pass

class HouseListView(HouseMixin, ListView):
  pass
Run Code Online (Sandbox Code Playgroud)

等等,那么所有这些观点都将house在上下文中出现.

  • 哇这真的有效!我认为super(HouseMixin,self).get_context_data(**kwargs)会返回一个错误,因为HouseMixin的超级对象和对象没有定义get_context_data.你能解释一下为什么它有效吗? (3认同)
  • 只要其中一个父类实现该方法,它就可以工作,如果没有,它会引发错误.所以这个mixin被设计为与任何实现.get_context_data()的Django视图混合. (3认同)
  • 是的,父类的顺序会影响MRO,请在此处阅读带有其历史记录链接的SO答案:http://stackoverflow.com/a/3277407/43490 (2认同)