将其他项插入Django / Python中的继承列表中

时间:2010-09-27 14:14:27

标签: python django list django-admin

我在我的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很新,一般都是继承,所以我确信我有一些简单的东西。

谢谢

2 个答案:

答案 0 :(得分:2)

您需要使用:

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

此外,您需要将list_displaytupleimmutable}更改为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