gpt4 book ai didi

django中的Python多重继承函数覆盖和ListView

转载 作者:IT老高 更新时间:2023-10-28 21:09:53 25 4
gpt4 key购买 nike

我创建了一个子类 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 是:

  1. 我的 ListView
  2. ListSortedMixin
  3. ListPaginatedMixin
  4. ListView
  5. 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com