logo oujood
🔍

Personnaliser l'administration Django

L'interface d'administration Django est fonctionnelle dès l'enregistrement d'un modèle, mais elle devient vraiment productive une fois personnalisée. Ce chapitre couvre les options les plus utiles de ModelAdmin : filtres, recherche, organisation des formulaires et actions groupées.

OUJOOD.COM

Les options de ModelAdmin

Toute la personnalisation de l'administration Django passe par une classe qui hérite de ModelAdmin. Vous la déclarez dans admin.py et la passez en deuxième argument à admin.site.register(). Chaque attribut de cette classe modifie un aspect de l'interface.

Ajouter des filtres latéraux

list_filter ajoute un panneau de filtres sur le côté droit de la liste. L'utilisateur peut filtrer les enregistrements par les valeurs d'un champ en un clic.

  📋 Copier le code

from django.contrib import admin
from .models import Membres

class MembresAdmin(admin.ModelAdmin):
    list_display = ('prenom', 'nom', 'mail')
    # Panneau de filtres sur la droite
    list_filter  = ('nom',)

admin.site.register(Membres, MembresAdmin)

list_filter est particulièrement utile sur des champs à valeurs répétées comme une catégorie, un statut ou une ville. Sur un champ texte libre comme nom, il listera toutes les valeurs distinctes.

Ajouter une barre de recherche

search_fields affiche une barre de recherche au-dessus de la liste. Django effectue une recherche textuelle sur les champs que vous indiquez.

  📋 Copier le code

class MembresAdmin(admin.ModelAdmin):
    list_display  = ('prenom', 'nom', 'mail')
    list_filter   = ('nom',)
    # Recherche simultanée dans prenom, nom et mail
    search_fields = ('prenom', 'nom', 'mail')

Django cherche le terme saisi dans tous les champs listés avec un OR — un résultat apparaît si le terme est trouvé dans au moins un des champs.

Champs en lecture seule

readonly_fields empêche la modification de certains champs dans le formulaire d'édition. Utile pour les champs générés automatiquement comme une date de création ou un identifiant externe.

  📋 Copier le code

class MembresAdmin(admin.ModelAdmin):
    list_display   = ('prenom', 'nom', 'mail')
    # Le champ mail s'affiche mais ne peut pas être modifié
    readonly_fields = ('mail',)

Organiser le formulaire avec fieldsets

fieldsets divise le formulaire d'édition en sections nommées. Quand un modèle a beaucoup de champs, cette organisation améliore considérablement la lisibilité.

  📋 Copier le code

class MembresAdmin(admin.ModelAdmin):
    fieldsets = (
        # Section "Identité" avec prenom et nom
        ('Identité', {
            'fields': ('prenom', 'nom')
        }),
        # Section "Contact" avec mail, repliée par défaut
        ('Contact', {
            'fields': ('mail',),
            'classes': ('collapse',),
        }),
    )

L'option 'classes': ('collapse',) rend la section repliable — elle s'affiche fermée par défaut et s'ouvre au clic. Pratique pour les champs secondaires ou rarement modifiés.

Ajouter des actions groupées

Les actions groupées permettent d'appliquer une opération sur plusieurs enregistrements sélectionnés à la fois. Django propose une action delete_selected par défaut. Voici comment en ajouter une personnalisée :

  📋 Copier le code

from django.contrib import admin
from .models import Membres

def exporter_emails(modeladmin, request, queryset):
    # queryset contient les enregistrements sélectionnés
    emails = queryset.values_list('mail', flat=True)
    print(list(emails))  # Remplacez par votre logique d'export

exporter_emails.short_description = "Exporter les emails sélectionnés"

class MembresAdmin(admin.ModelAdmin):
    list_display = ('prenom', 'nom', 'mail')
    actions      = [exporter_emails]

admin.site.register(Membres, MembresAdmin)

Configuration complète — exemple récapitulatif

Voici un fichier admin.py complet combinant les options les plus courantes :

  📋 Copier le code

from django.contrib import admin
from .models import Membres

class MembresAdmin(admin.ModelAdmin):
    list_display   = ('prenom', 'nom', 'mail')
    list_filter    = ('nom',)
    search_fields  = ('prenom', 'nom', 'mail')
    readonly_fields = ('mail',)
    fieldsets = (
        ('Identité', {'fields': ('prenom', 'nom')}),
        ('Contact',  {'fields': ('mail',), 'classes': ('collapse',)}),
    )

admin.site.register(Membres, MembresAdmin)

Par carabde | Mis à jour le 05 mai 2025