我正在为django管理类做一个单继承子类,如下所示:
from django.contrib.auth import admin as auth_admin
class UserAdmin(auth_admin.UserAdmin):
pass
我收到错误:“元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类”
我想我明白错误在抱怨什么 - 但我不清楚为什么我只用一个祖先来获取它。每隔一段时间我都会看到这个错误,因为我正在使用多重继承。单个祖先的班级元类与之相冲突的是什么?
答案 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的情况下注入一个类,从而导致元类型不匹配。