Вставка дополнительных элементов в унаследованный список в Django / Python - PullRequest
0 голосов
/ 27 сентября 2010

Я использую некоторые подклассы в своем приложении 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 ]

2 голосов
/ 27 сентября 2010

Вам нужно будет использовать:

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

Также вам нужно изменить list_display с tuple (который неизменный ) на 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 голос
/ 27 сентября 2010

Дэвид на месте.Также, как примечание, если вы хотите сослаться на переменную в классе, вам нужно использовать 'self.'

Пример:

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

   def display_list(self):
      for i in self.mylist:
           print i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...