元类与单继承冲突

时间:2012-12-08 20:47:43

标签: python django metaclass

我正在为django管理类做一个单继承子类,如下所示:

from django.contrib.auth import admin as auth_admin

class UserAdmin(auth_admin.UserAdmin):
   pass

我收到错误:“元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类”

我想我明白错误在抱怨什么 - 但我不清楚为什么我只用一个祖先来获取它。每隔一段时间我都会看到这个错误,因为我正在使用多重继承。单个祖先的班级元类与之相冲突的是什么?

2 个答案:

答案 0 :(得分:1)

如果为UserAdmin选择了不正确的元类,可能会发生这种情况,例如__metaclass__以某种方式插入到新生类的dict中。尝试以下测试:

# force the correct metaclass:
metaclass = type(auth_admin.UserAdmin)
UserAdmin = metaclass("UserAdmin", (auth_admin.UserAdmin,), {})

如果这样做,则意味着type(auth_admin.UserAdmin)语句中将挑选除class以外的元类。应该通过为__metaclass__ grepping Django源和mixins来揭示罪魁祸首。

如果失败并出现相同的错误,则可能是元类构造函数正在进行自己的一些类构造,由于真正的多重继承错误而失败。在这种情况下,堆栈跟踪应该显示出现这种情况。

答案 1 :(得分:1)

该问题与实际的管理类无关 - 用于add_form的表单必须是ModelForm的子类 - 在这种情况下,它只是一个普通的表单。当添加到页面时,django会对表单进行内省,并尝试在不是ModelForm的情况下注入一个类,从而导致元类型不匹配。