Personalizzare l'Admin
Django offre un sistema estremamente flessibile per personalizzare il pannello di amministrazione. Attraverso la classe ModelAdmin puoi controllare ogni aspetto dellâinterfaccia, dalla visualizzazione delle liste ai form di modifica.
ModelAdmin e list_display
La proprietĂ list_display definisce quali campi mostrare nella lista degli oggetti:
from django.contrib import admin
from .models import Articolo
@admin.register(Articolo)
class ArticoloAdmin(admin.ModelAdmin):
list_display = ['titolo', 'autore', 'data_pubblicazione', 'pubblicato']
Filtri e Ricerca
Con list_filter e search_fields puoi aggiungere filtri laterali e una barra di ricerca:
@admin.register(Articolo)
class ArticoloAdmin(admin.ModelAdmin):
list_display = ['titolo', 'autore', 'data_pubblicazione', 'pubblicato']
list_filter = ['pubblicato', 'data_pubblicazione', 'autore']
search_fields = ['titolo', 'contenuto']
date_hierarchy = 'data_pubblicazione'
date_hierarchy aggiunge una navigazione per data nella parte superiore della lista.
Campi Modificabili nella Lista
Con list_editable puoi rendere alcuni campi modificabili direttamente dalla lista, senza entrare nel dettaglio:
@admin.register(Articolo)
class ArticoloAdmin(admin.ModelAdmin):
list_display = ['titolo', 'autore', 'pubblicato', 'in_evidenza']
list_editable = ['pubblicato', 'in_evidenza']
Nota: un campo in list_editable non puo essere il primo campo in list_display.
Campi di Sola Lettura e Fieldsets
Puoi definire campi di sola lettura e organizzare il form in sezioni con fieldsets:
@admin.register(Articolo)
class ArticoloAdmin(admin.ModelAdmin):
readonly_fields = ['data_creazione', 'data_modifica']
fieldsets = [
('Informazioni Principali', {
'fields': ['titolo', 'autore', 'contenuto']
}),
('Pubblicazione', {
'fields': ['pubblicato', 'data_pubblicazione'],
'classes': ['collapse'],
}),
('Metadati', {
'fields': ['data_creazione', 'data_modifica'],
'classes': ['collapse'],
}),
]
La classe collapse rende una sezione inizialmente chiusa.
Inline: Modelli Correlati
Le inline permettono di modificare modelli correlati direttamente dalla pagina di un altro modello. Esistono due tipi principali:
from .models import Articolo, Commento, Allegato
class CommentoInline(admin.TabularInline):
model = Commento
extra = 1 # numero di form vuoti da mostrare
class AllegatoInline(admin.StackedInline):
model = Allegato
extra = 0
@admin.register(Articolo)
class ArticoloAdmin(admin.ModelAdmin):
list_display = ['titolo', 'autore', 'pubblicato']
inlines = [CommentoInline, AllegatoInline]
TabularInline mostra i modelli correlati in formato tabella compatta, mentre StackedInline li mostra uno sopra lâaltro in formato esteso.
Azioni Personalizzate
Le azioni admin permettono di eseguire operazioni su piu oggetti selezionati contemporaneamente:
@admin.register(Articolo)
class ArticoloAdmin(admin.ModelAdmin):
list_display = ['titolo', 'autore', 'pubblicato']
actions = ['pubblica_articoli', 'rimuovi_pubblicazione']
@admin.action(description="Pubblica gli articoli selezionati")
def pubblica_articoli(self, request, queryset):
count = queryset.update(pubblicato=True)
self.message_user(request, f"{count} articoli pubblicati.")
@admin.action(description="Rimuovi la pubblicazione")
def rimuovi_pubblicazione(self, request, queryset):
queryset.update(pubblicato=False)
Il decoratore @admin.action in Django 5.x sostituisce la vecchia sintassi con short_description.
Sovrascrivere i Template dellâAdmin
Puoi personalizzare lâaspetto dellâadmin sovrascrivendo i template. Crea la cartella templates/admin/ nel tuo progetto:
# struttura delle cartelle
# templates/
# admin/
# base_site.html
# myapp/
# articolo/
# change_list.html
Un esempio di override del template base:
# templates/admin/base_site.html
# {% extends "admin/base.html" %}
# {% block title %}Pannello di Gestione{% endblock %}
# {% block branding %}
# <h1>Il Mio Pannello Personalizzato</h1>
# {% endblock %}
Metodi Personalizzati in list_display
Puoi aggiungere colonne calcolate nella lista:
@admin.register(Articolo)
class ArticoloAdmin(admin.ModelAdmin):
list_display = ['titolo', 'autore', 'conteggio_parole', 'pubblicato']
@admin.display(description="Parole", ordering="contenuto")
def conteggio_parole(self, obj):
return len(obj.contenuto.split())
Conclusione
La personalizzazione del pannello admin di Django permette di creare interfacce di gestione complete e professionali. Combinando list_display, filtri, inline e azioni personalizzate, puoi adattare lâadmin a qualsiasi esigenza del tuo progetto senza dover costruire unâinterfaccia da zero.