2010-09-27 26 views
0

我在我的Django应用程序中使用了一些子类,并且通过我的管理实现继续执行该逻辑。将额外的项目插入到Django/Python中的继承列表中

目前,我有这个管理员确定指标:

class StellarObjectAdmin(admin.ModelAdmin): 
    list_display = ('title','created_at','created_by','updated_at','updated_by) 

现在,我有一个星球类,即StellarObject的一个子类,另外还有场。我想将此字段添加到list_display(不能完全替换StellarObject的显示)。

如果我尝试这样:

class PlanetAdmin(StellarObjectAdmin): 
    list_display.insert(1,'size') 

我得到以下错误:

name 'list_display' is not defined 

我承认,我是很新的蟒蛇,和一般的继承,所以我我确定有一些简单的我错过了。

谢谢

回答

2

你需要使用:

StellarObjectAdmin.list_display.insert(1, 'size') 

此外,你需要从tuple改变list_display(这是immutable)到list。例如:list_display = [ ... ]

最后,您可能会对所发生的事情感到惊讶:通过插入该项目,您将要更改StellarObjectAdmin上的列表。你可能想要做的是:

list_display = list(StellarObjectAdmin.list_display) # copy the list 
list_display.insert(1, 'size') 

这将创建列表的新副本为你PlanetAdmin类。

这是因为Python继承的方式。基本上,Python从不会将名称注入名称空间(例如,某些语言为方法注入了一个魔术变量“this”,而Python迫使您明确定义等效方法 - 作为方法的第一个参数),并且因为class只是另一个命名空间,没有任何东西(比如它的超类中的值)被注入到它中。

当你有一个类,B,它从另一个类,A继承,并尝试查找属性上B - B.foo - 它首先检查是否fooB的命名空间,如果不是,则继续检查A的名称空间,等等。

我希望这是明确的......如果不是,我可以澄清(或尝试找到相关文档)。

1

大卫是现货。另外,作为一个说明,如果你想引用类中的变量,你需要使用'self'。

实施例:

Class A: 
    mylist = [1,2,3] 

    def display_list(self): 
     for i in self.mylist: 
      print i 
相关问题