1

次のように、django admin クラスの単一継承サブクラスを実行しています。

from django.contrib.auth import admin as auth_admin

class UserAdmin(auth_admin.UserAdmin):
   pass

そして、「メタクラスの競合: 派生クラスのメタクラスは、そのすべてのベースのメタクラスの (厳密ではない) サブクラスでなければなりません」というエラーが表示されます。

エラーが何について不平を言っているのか理解していると思いますが、祖先が1つだけでエラーが発生する理由は明確ではありません。このエラーが毎回発生するのは、多重継承を使用しているためです。単一の祖先のクラス メタクラスは何と競合する可能性がありますか?

4

2 に答える 2

1

この問題は、実際の管理者クラスとは無関係であることが判明しました。add_form に使用されるフォームは、ModelForm のサブクラスである必要があります。この場合、単純なフォームでした。ページに追加すると、django はフォームをイントロスペクトし、ModelForm でない場合はクラスを挿入しようとし、メタタイプの不一致につながります。

于 2012-12-09T22:56:45.730 に答える
1

UserAdminこれは、たとえば__metaclass__、初期クラスの dict に何らかの方法で挿入された場合など、 に対して誤ったメタクラスが選択された場合に発生する可能性があります。次のテストを試してください。

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

これが機能する場合は、ステートメントで以外のメタクラスtype(auth_admin.UserAdmin)が選択されていることを意味します。class原因は、Django のソースと mixin を grep することで明らかになるはずです__metaclass__

これが同じエラーで失敗する場合は、メタクラス コンストラクターが独自のクラス構築を行っている可能性があり、真の多重継承エラーのために失敗します。その場合、スタック トレースは、これが発生した場所を明らかにする必要があります。

于 2012-12-08T21:23:39.583 に答える