00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.