我创建了一个子类 ListView
和两个自定义 mixin,它们实现了 get_context_data
函数。我想在子类上覆盖这个函数:
from django.views.generic import ListView
class ListSortedMixin(object):
def get_context_data(self, **kwargs):
print 'ListSortedMixin'
return kwargs
class ListPaginatedMixin(object):
def get_context_data(self, **kwargs):
print 'ListPaginatedMixin'
return kwargs
class MyListView(ListSortedMixin, ListPaginatedMixin, ListView):
def get_context_data(self, **context):
super(ListSortedMixin,self).get_context_data(**context)
super(ListPaginatedMixin,self).get_context_data(**context)
return context
当我执行 MyListView
时,它只打印 "ListSortedMixin"
。由于某种原因,python 正在执行 ListSortedMixin.get_context_data
代替 MyListView.get_context_data
。为什么?
如果我将继承顺序更改为 ListPaginatedMixin, ListSortedMixin, ListView
,则执行 ListPaginatedMixin.get_context_data
。
如何覆盖 get_context_data
函数?
最佳答案
这是一个老问题,但我认为答案不正确。您的代码中有错误。它应该是:
class MyListView(ListSortedMixin, ListPaginatedMixin, ListView):
def get_context_data(self, **context):
super(MyListView,self).get_context_data(**context)
return context
get_context_data
的调用顺序与 MyListView
声明中指定的顺序相同。注意 super 的参数是 MyListView
而不是父类(super class)。
更新:
我错过了你的 mixin 不调用 super。他们应该。是的,即使它们继承自 object,因为 super 调用 MRO 中的 next 方法,不一定是它所在类的父类。
from django.views.generic import ListView
class ListSortedMixin(object):
def get_context_data(self, **kwargs):
print 'ListSortedMixin'
return super(ListSortedMixin,self).get_context_data(**context)
class ListPaginatedMixin(object):
def get_context_data(self, **kwargs):
print 'ListPaginatedMixin'
return super(ListPaginatedMixin,self).get_context_data(**context)
class MyListView(ListSortedMixin, ListPaginatedMixin, ListView):
def get_context_data(self, **context):
return super(MyListView,self).get_context_data(**context)
对于 MyListView
,MRO 是:
- 我的 ListView
- ListSortedMixin
- ListPaginatedMixin
- ListView
- ListView 上面的内容 ... n.对象
一个一个地调用它们可能会起作用,但这不是它的预期使用方式。
更新 2
复制粘贴示例来证明我的观点。
class Parent(object):
def get_context_data(self, **kwargs):
print 'Parent'
class ListSortedMixin(object):
def get_context_data(self, **kwargs):
print 'ListSortedMixin'
return super(ListSortedMixin,self).get_context_data(**kwargs)
class ListPaginatedMixin(object):
def get_context_data(self, **kwargs):
print 'ListPaginatedMixin'
return super(ListPaginatedMixin,self).get_context_data(**kwargs)
class MyListView(ListSortedMixin, ListPaginatedMixin, Parent):
def get_context_data(self, **kwargs):
return super(MyListView,self).get_context_data(**kwargs)
m = MyListView()
m.get_context_data(l='l')
关于django中的Python多重继承函数覆盖和ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9939256/