2012-12-08 61 views
1

我在做一個子類繼承了Django管理類,像這樣的元類衝突派生類的元類必須是所有基類的元類的(非嚴格的)子類「與單繼承

我想我明白錯誤在抱怨什麼 - 但我不清楚爲什麼我只用一個祖先得到它。每隔一段時間我看到這個錯誤,這是因爲我正在使用多重繼承。單個祖先的類別元類可能與什麼衝突?

回答

1

問題竟然是毫無關係的實際管理類 - 用於add_form必須的ModelForm的子類的形式 - 在這種情況下,它只是一個簡單的表格。當添加到頁面時,django反省了表單,並嘗試在不是ModelForm的情況下注入類,從而導致元類型不匹配。

+0

但在上述情況下,代碼甚至不叫'add_form',並且它仍然拋出的異常?順便說一句,問題是解決問題 - 隨時接受你的答案,所以問題不會留在未答覆的狀態。 – user4815162342

+0

add_form是一個屬性 - 我猜,對於管理類的元類嘗試創建形式,所以被定義的類發生衝突的時候。 – gone

1

如果不正確的元類得到選擇爲UserAdmin,例如通過__metaclass__某種程度上得到插入新生類的字典就會出現這種情況。試試下面的測試:

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

如果一切正常,就意味着比其他type(auth_admin.UserAdmin)元類在class聲明是越來越挑。罪魁禍首應該通過對Django源代碼和mixins進行搜索來獲得__metaclass__

如果失敗,出現同樣的錯誤,這可能是因爲元類構造函數做一些一流的施工人員自身,它失敗,因爲一個真正的多重繼承的錯誤。在這種情況下,堆棧跟蹤應該顯示出現這種情況的位置。