Dans cette image, seul le titre apparaît ici, j'ai utilisé:
def __unicode__(self):
return self.title;
Comment afficher tous ces champs?
Comment afficher tous les champs de chaque page de modèle?
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
.
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)
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()]
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.
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.
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()]
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:
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
Afficher tous les champs:
list_display = [field.attname for field in BookModel._meta.fields]