gpt4 book ai didi

django - ModelAdmin 的 Mixin 问题

转载 作者:行者123 更新时间:2023-12-01 07:44:23 25 4
gpt4 key购买 nike

我覆盖了一个 ModelAdmin 方法,因此:

def response_change(self, request, obj):
# alter redirect location if 'source' is found in GET
response = super(JobOptions, self).response_change(request, obj)
source = request.GET.get('source', None)
if source:
response['location'] = source
return response

与其在每个模型上都重复这一点,我想让它成为一个 mixin。

如果我做:
def RedirectMixin(admin.ModelAdmin)

进而:
def MyModel(admin.ModelAdmin, RedirectMixin)

然后我收到 MRO 错误。

但是,如果 RedirectMixin 不从 admin.ModelAdmin 继承,则不会调用该方法。

另一个问题是如何概括 super() 调用,使其没有硬编码的父类(super class)。

最佳答案

首先,我想你的意思是 class而不是 def在你的例子中。

无论如何,使用 Mixin 的正确方法是首先在要继承的类列表中使用它。所以:

class RedirectMixin(object):


class MyModelAdmin(RedirectMixin, admin.ModelAdmin):

这是因为 Python 按照声明的顺序查找所有父类以查找方法,并调用它找到的第一个方法。

至于 super ,这根本不应该提到父类(super class)——这就是它的全部意义所在。它应该引用当前类:
return super(MyModelAdmin, self).__init__(self, *args, **kwargs)

管他呢。

评论后编辑 是的,mixin 应该在 super 中引用它自己的类。称呼。考虑以下:
In [1]: class BaseClass(object):
...: def my_function(self):
...: print 'base my_function'
...:

In [2]: class Mixin(object):
...: def my_function(self):
...: print 'mixin my_function'
...: super(Mixin, self).my_function()
...:

In [3]: class MyDerivedClass(Mixin, BaseClass):
...: pass
...:

现在,如果您实例化子类并调用它的 my_function方法,MRO 会如你所料发生,即使 Mixin 没有从 BaseClass 继承:
In [4]: m=MyDerivedClass()

In [5]: m.my_function()
mixin my_function
base my_function

如果您无法制作 Mixin,就会出现您提到的错误 object的后代- 如果不这样做,则是旧式类,不支持使用 super。

关于django - ModelAdmin 的 Mixin 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6070396/

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