2017-07-21 1 views
1

J'ai écrit une classe de base pour les classes d'administration pour toutes mes classes qui ont un champ appelé is_active. Il permet à l'utilisateur de voir les enregistrements de la table avec le champ is_active afin qu'ils puissent voir quel enregistrement est actif ou non et ils peuvent le modifier.Classe d'administration de base avec un dynamic list_display

Pour la plupart des classes que j'ai dans mes modèles, il y a un champ appelé name donc je peux facilement écrire 2 lignes du code en admin.py et avoir une représentation d'administration personnalisée, mais le problème est pour les classes qui don Ne pas avoir un champ appelé name donc je dois utiliser un champ différent dans list_display. Puisque le nombre de ces classes est élevé, je cherche une solution pour obtenir dynamiquement le nom du champ qui doit être dans le list_display. Toutes les idées pour résoudre ce problème seraient très appréciées.

models.py:

class BaseAdmin(admin.ModelAdmin): 
    list_display=('id','name','is_active') 
    list_editable = ('is_active',) # this MUST only contain fields that also are in "list_display" 
    search_fields=('name',) 


class ClassA(models.Model): 
    name=models.CharField(max_length=20, blank=False, unique=True,) 
    is_active=models.BooleanField(default=True,) 

    def __str__(self): 
      return self.name 

class ClassB(models.Model): 
    my_field=models.CharField(max_length=20, blank=False, unique=True,) 
    is_active=models.BooleanField(default=True,) 

    def __str__(self): 
      return self.my_field 

admin.py

class ClassAAdmin(BaseAdmin): 
    pass 

class ClassBAdmin(BaseAdmin): 
    pass 

Répondre

0

Vous recherchez get_list_displayhttps://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_list_display

utilisation que conjointement avec ModelAdmin.model (c.-à-self.model à l'intérieur duMéthode) pour créer un affichage de liste dynamique basé sur le modèle.

Notez que je recommande personnellement de ne pas faire de cette automatisation dans le BaseAdmin, et de définir ce qui est différent entre la sous-classe ModelAdmin s (dans ce cas, list_display) séparément. C'est plus explicite et clair. C'est une opinion pure cependant.

+0

Je connaissais 'get_list_display' mais mon problème est que je n'arrivais pas à comprendre comment. Si c'était 10-20 classes, ça ne me dérangerait pas de les définir séparément, mais nous parlons de 100-200, donc ça vaut vraiment la peine de trouver quelque chose de beaucoup plus court. Je n'arrive pas à comprendre comment je peux donner à la méthode une liste de tous les champs (un champ pour chaque classe) afin qu'elle puisse choisir la bonne pour le list_display – Ibo