[Django] Definire azioni personalizzate

Uno dei vantaggi principali di Django è che integra al suo interno una comoda interfaccia di admin già pronta all’uso che, tra le altre cose, ci permette di definire azioni personalizzate.

L’interfaccia di admin mette a disposizione un CRUD completo che ci permette di interagire con i dati presenti a db senza dover scrivere una singola riga di codice.

Django admin non è solamente un semplice CRUD ma uno strumento personalizzabile molto potente.

Una delle funzionalità che ritengo più utili è la possibilità di eseguire operazioni in batch su un grande numero di oggetti contemporaneamente. Questo è possibile utilizzando il menù a tendina che si trova in cima alla lista.

Di default questo menù contiene l’azione per cancellare tutti i record selezionati.

Come fare per aggiungere azioni personalizzate in questo menù? Vediamo di seguito la procedura.

Supponiamo di voler aggiungere un’azione che ci permette di esportare all’interno di un file CSV la lista dei clienti selezionati.

In cima al file admin.py andiamo ad aggiungere la seguente funzione:

def export_customers(modeladmin, request, queryset):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="customer_export.csv"'
    
    writer = csv.writer(response)
    writer.writerow([' ', 'Cognome', 'Nome', 'Email', 'Telefono'])
    
    for a in queryset:
        writer.writerow([' ', a.last_name, a.first_name, a.email, a.phone])

    return response
export_customers.short_description = "Esporta clienti in excel"

La prima cosa da notare è il terzo parametro passato alla funzione: queryset.

Questo parametro contiene al suo interno la lista di oggetti selezionati.

Utilizzando quindi un ciclo for possiamo scorrere la lista di oggetti ed eseguire operazioni su di essi.

Andremo poi ad aggiungere i campi che ci interessano al nostro file CSV (non scendiamo troppo nel merito in questo post).

Infine con:

export_customers.short_description = "Esporta clienti in excel"

Andiamo a definire la stringa che dovrà comparire all’interno del menù a tendina.

Definita la funzione che si occuperà di processare gli oggetti selezionati dobbiamo collegarla alla relativa classe di admin.

Nella classe di admin dei nostri clienti aggiungiamo la seguente definizione:

actions = [export_customers,]

Torniamo sul browser, aggiorniamo la pagina e ora nel menù a tendina abbiamo la nuova voce.

Per testare il corretto funzionamento selezioniamo uno o più record dalla lista e poi utilizziamo questa nuova voce.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *