我在我的Django应用程序中使用了一些子类,并且我将这种逻辑继续用于我的管理实现。
目前,我有这个管理员定义:
class StellarObjectAdmin(admin.ModelAdmin):
list_display = ('title','created_at','created_by','updated_at','updated_by)
现在,我有一个Planet类,它是StellarObject的子类,带有一个额外的字段。我想将此字段添加到list_display(不完全替换StellarObject的显示)。
如果我尝试这样的话:
class PlanetAdmin(StellarObjectAdmin):
list_display.insert(1,'size')
我收到以下错误:
name 'list_display' is not defined
我会承认,我对python很新,一般都是继承,所以我确信我有一些简单的东西。
谢谢
答案 0 :(得分:2)
您需要使用:
StellarObjectAdmin.list_display.insert(1, 'size')
此外,您需要将list_display
从tuple
(immutable}更改为list
。例如:list_display = [ ... ]
。
最后,您可能会对发生的事情感到惊讶:通过插入项目,您将要更改StellarObjectAdmin
上的列表。你可能想做的是:
list_display = list(StellarObjectAdmin.list_display) # copy the list
list_display.insert(1, 'size')
这将为您的PlanetAdmin
课程创建列表的新副本。
这是因为Python进行继承的方式。基本上,Python从不将名称注入命名空间(例如,某些语言将一个魔术this
“变量”注入到方法中,而Python则强制您明确定义等效项 - self
- 作为方法的第一个参数),因为class
只是另一个命名空间,所以没有任何内容(例如,超类中的值)被注入其中。
当您上课时,B
继承自另一个班级A
,并且您尝试在B
- B.foo
上查找属性 - 它首先检查foo
是否在B
的命名空间中,如果不是,则继续检查A
的命名空间,依此类推。
我希望这很明确......如果没有,我可以澄清(或尝试查找相关文档)。
答案 1 :(得分:1)
大卫是个好消息。另外,作为注释,如果要在类中引用变量,则需要使用“self”。
示例:
Class A:
mylist = [1,2,3]
def display_list(self):
for i in self.mylist:
print i