1

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

from django.contrib.auth import admin as auth_admin

class UserAdmin(auth_admin.UserAdmin):
   pass

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

我想我理解错误在抱怨什么——但我不清楚为什么我只用一个祖先得到它。每次我看到这个错误,都是因为我使用了多重继承。单一祖先的类元类可能与什么冲突?

4

2 回答 2

1

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

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

type(auth_admin.UserAdmin)如果这可行,则意味着在您的class声明中选择了一个元类。罪魁祸首应该通过对__metaclass__.

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

于 2012-12-08T21:23:39.583 回答
1

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

于 2012-12-09T22:56:45.730 回答