2010-09-27 7 views
0

J'utilise certaines sous-classes dans mon application Django, et je continue cette logique jusqu'à l'implémentation de mon admin.Insertion d'éléments supplémentaires dans une liste héritée dans Django/Python

Actuellement, je cette administration défintion:

class StellarObjectAdmin(admin.ModelAdmin): 
    list_display = ('title','created_at','created_by','updated_at','updated_by) 

Maintenant, j'ai une classe planète, qui est une sous-classe de StellarObject, avec un champ supplémentaire. Je souhaite ajouter ce champ à list_display (ne pas remplacer entièrement l'affichage de StellarObject).

Si je tente quelque chose comme ceci:

class PlanetAdmin(StellarObjectAdmin): 
    list_display.insert(1,'size') 

Je reçois l'erreur suivante:

name 'list_display' is not defined 

Je dois admettre, je suis très nouveau pour python, et l'héritage en général, donc je suis sûr qu'il y a quelque chose de simple qui me manque.

Merci

Répondre

2

Vous devez utiliser:

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

En outre, vous devrez changer list_display d'un tuple (qui est immutable) à un list. Par exemple: list_display = [ ... ]. Enfin, vous serez probablement surpris par ce qui se passe: en insérant l'élément, vous changerez la liste sur StellarObjectAdmin. Ce que vous voulez sans doute faire est:

list_display = list(StellarObjectAdmin.list_display) # copy the list 
list_display.insert(1, 'size') 

qui va créer une nouvelle copie de la liste pour votre classe PlanetAdmin.

Cela se produit en raison de la façon dont Python fait de l'héritage. Fondamentalement, Python n'injecte jamais de noms dans un espace de noms (par exemple, certains langages injectent une variable "variable" magique dans les méthodes, alors que Python vous oblige à définir explicitement l'équivalent - self - comme premier argument de méthodes) et qu'un class est juste un autre espace de nommage, rien (comme, par exemple, les valeurs dans ses super classes) n'est injecté dedans.

Lorsque vous avez une classe, B, qui hérite d'une autre classe, A, et vous essayez de rechercher une propriété sur B-B.foo - il vérifie d'abord pour voir si foo est dans l'espace de noms de B, et si ce n'est pas le cas, il vérifie l'espace de noms de A, et ainsi de suite.

J'espère que c'est clair ... Sinon, je peux clarifier (ou essayer de trouver la documentation pertinente).

1

David est sur place. En outre, si vous voulez faire référence à la variable dans la classe, vous devez utiliser 'self'.

Exemple:

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

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