web-dev-qa-db-fra.com

Comment afficher tous les champs du modèle dans la page d'administration?

voici la page des modèles

Dans cette image, seul le titre apparaît ici, j'ai utilisé:

 def __unicode__(self):
        return self.title;  

voici les objets individuels

Comment afficher tous ces champs?

Comment afficher tous les champs de chaque page de modèle?

27
iCodeLikeImDrunk

Par défaut, la disposition d'administration affiche uniquement ce qui est renvoyé par la fonction unicode de l'objet. Pour afficher autre chose, vous devez créer un formulaire d'administration personnalisé dans app_dir/admin.py.

Voir ici: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#Django.contrib.admin.ModelAdmin.list_display

Vous devez ajouter un formulaire d'administration et définir le list_display champ.

Dans votre exemple spécifique:

class BookAdmin(admin.ModelAdmin):
    list_display = ('Title', 'Author', 'Price')
admin.site.register(Book, BookAdmin)
38
Amirshk

Si vous souhaitez inclure tous les champs sans saisir tous les noms de champs, vous pouvez utiliser

list_display = BookAdmin._meta.get_all_field_names()

L'inconvénient est que les champs sont triés.

Modifier:

Cette méthode est déconseillée dans Django 1.10 Voir Migration depuis l'ancienne API pour référence. La suite devrait fonctionner à la place pour Django >= 1.9 pour la plupart des cas -

list_display = [field.name for field in Book._meta.get_fields()]
50
OBu

Si vous souhaitez inclure tous les noms de champ sauf ManyToManyField et les avoir dans le même ordre que dans le fichier models.py, vous pouvez utiliser:

list_display = [field.name for field in Book._meta.fields if field.name != "id"]

Comme vous pouvez le voir, j'ai également exclu l'ID.

Si vous vous retrouvez souvent à faire cela, vous pouvez créer une sous-classe de ModelAdmin:

class CustomModelAdmin(admin.ModelAdmin):

    def __init__(self, model, admin_site):
        self.list_display = [field.name for field in model._meta.fields if field.name != "id"]
        super(CustomModelAdmin, self).__init__(model, admin_site)

puis héritez juste de cela:

class BookAdmin(CustomModelAdmin):
    pass

ou vous pouvez le faire en mixage:

class CustomModelAdminMixin(object):

    def __init__(self, model, admin_site):
        self.list_display = [field.name for field in model._meta.fields if field.name != "id"]
        super(CustomModelAdminMixin, self).__init__(model, admin_site)

class TradeAdmin(CustomModelAdminMixin, admin.ModelAdmin):
    pass

Le mixin est utile si vous souhaitez hériter d'autre chose que admin.ModelAdmin.

27
KrisF

J'ai trouvé la réponse de OB ici très utile pour moi. Il mentionne:

L'inconvénient est que les champs sont triés.

Un petit ajustement à sa méthode résout également ce problème:

list_display  = [f.name for f in Book._meta.fields]

A travaillé pour moi.

14
sivanr

La plupart des réponses sont brisées par Django 1.10. Pour la version 1.10 ou supérieure, cela devrait être

list_display = [f.name for f in Book._meta.get_fields()]

Documents

6
Jose Cherian

Voici mon approche, fonctionnera avec n'importe quelle classe de modèle:

MySpecialAdmin = lambda model: type('SubClass'+model.__name__, (admin.ModelAdmin,), {
    'list_display': [x.name for x in model._meta.fields],
    'list_select_related': [x.name for x in model._meta.fields if isinstance(x, (ManyToOneRel, ForeignKey, OneToOneField,))]
})

Cela fera deux choses:

  1. Ajouter tous les champs à l'administrateur du modèle
  2. S'assure qu'il n'y a qu'un seul appel de base de données pour chaque objet associé (au lieu d'un par instance)

Puis pour enregistrer votre modèle:

admin.site.register(MyModel, MySpecialAdmin(MyModel))

Remarque: si vous utilisez un administrateur de modèle par défaut différent, remplacez 'admin.ModelAdmin' par votre classe de base d'administration

5
Vackar Afzal

Afficher tous les champs:

list_display = [field.attname for field in BookModel._meta.fields]
3
JohnDHH