在Django/Python中将附加项插入到继承的列表中
我在我的Django应用程序中使用了一些子类,并将这种逻辑延续到我的管理实现中 目前,我有以下管理定义:在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
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从不将名称注入名称空间(例如,一些语言将magicthis
“变量”注入方法,而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从不将名称注入名称空间(例如,一些语言将magicThis
“变量”注入方法,而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