在Django/Python中将附加项插入到继承的列表中

在Django/Python中将附加项插入到继承的列表中,python,django,list,django-admin,Python,Django,List,Django Admin,我在我的Django应用程序中使用了一些子类,并将这种逻辑延续到我的管理实现中 目前,我有以下管理定义: class StellarObjectAdmin(admin.ModelAdmin): list_display = ('title','created_at','created_by','updated_at','updated_by) 现在,我有一个行星类,它是StellarObject的一个子类,有一个额外的字段。我想将此字段添加到列表显示中(不完全替换StellarObject

我在我的Django应用程序中使用了一些子类,并将这种逻辑延续到我的管理实现中

目前,我有以下管理定义:

class StellarObjectAdmin(admin.ModelAdmin):
  list_display = ('title','created_at','created_by','updated_at','updated_by)
现在,我有一个行星类,它是StellarObject的一个子类,有一个额外的字段。我想将此字段添加到列表显示中(不完全替换StellarObject的显示)

如果我尝试这样的方法:

class PlanetAdmin(StellarObjectAdmin):
  list_display.insert(1,'size')
我得到以下错误:

name 'list_display' is not defined
我承认,我对python和继承都很陌生,所以我确信我缺少一些简单的东西

谢谢

您需要使用:

StellarObjectAdmin.list_display.insert(1, 'size')
此外,您还需要将
列表显示
元组
(即)更改为
列表
。例如:
list\u display=[…]

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

list_display = list(StellarObjectAdmin.list_display) # copy the list
list_display.insert(1, 'size')
这将为您的
PlanetAdmin
类创建列表的新副本

这是因为Python执行继承的方式。基本上,Python从不将名称注入名称空间(例如,一些语言将magic
this
“变量”注入方法,而Python强制您显式定义等价的--
self
——作为方法的第一个参数),并且由于
类只是另一个名称空间,所以什么都没有(比如,它的超类中的值)被注入其中

当你有一个类,
B
,它继承了另一个类,
a
,你试图在
B
-
B.foo
上查找一个属性,它首先检查
foo
是否在
B
的命名空间中,如果不在,则继续检查
a
的命名空间,依此类推

我希望这是清楚的…如果没有,我可以澄清(或尝试查找相关文档)。

您需要使用:

StellarObjectAdmin.list_display.insert(1, 'size')
此外,您还需要将
list\u display
tuple
(即)更改为
list
。例如:
list\u display=[…]

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

list_display = list(StellarObjectAdmin.list_display) # copy the list
list_display.insert(1, 'size')
这将为您的
PlanetAdmin
类创建列表的新副本

这是因为Python执行继承的方式。基本上,Python从不将名称注入名称空间(例如,一些语言将magic
This
“变量”注入方法,而Python强制您显式定义等价的-
self
-作为方法的第一个参数),并且由于
只是另一个名称空间,因此不会向其中注入任何内容(例如,其超类中的值)

当你有一个类,
B
,它继承了另一个类,
a
,你试图在
B
-
B.foo
上查找一个属性,它首先检查
foo
是否在
B
的命名空间中,如果不在,则继续检查
a
的命名空间,依此类推


我希望这一点很清楚……如果没有,我可以澄清(或尝试查找相关文档)。

David是正确的。另外,请注意,如果您想在类中引用变量,您需要使用“self”

例如:

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

   def display_list(self):
      for i in self.mylist:
           print i

David是正确的。另外,请注意,如果要在类中引用变量,则需要使用“self”

例如:

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

   def display_list(self):
      for i in self.mylist:
           print i