Nell'interfaccia di amministrazione di Django, c'è un modo per duplicare un oggetto?
-
05-07-2019 - |
Domanda
Ti stai solo chiedendo se esiste un modo semplice per aggiungere la funzionalità per duplicare un elenco esistente nell'interfaccia di amministrazione?
Nella registrazione dei dati ci siamo imbattuti in una situazione in cui molti articoli condividono dati generici con un altro oggetto e per risparmiare tempo sarebbe molto bello duplicare rapidamente un elenco esistente e modificare solo i dati modificati. L'uso di una struttura di modello migliore sarebbe un modo per ridurre la duplicazione dei dati, ma potrebbe esserci una situazione in cui i dati duplicati dovranno essere modificati su base individuale in futuro.
Soluzione
Puoi salvare come semplicemente abilitando l'aggiunta di questo al ModelAdmin:
save_as = True
Questo sostituisce il " Salva e aggiungi un altro " con un pulsante " Salva come " pulsante. " Salva con nome " significa che l'oggetto verrà salvato come nuovo oggetto (con un nuovo ID) anziché come oggetto vecchio.
Altri suggerimenti
C'è una soluzione migliore (ma non integrata) qui:
https://github.com/RealGeeks/django-modelclone
Dal loro README:
Django Admin ha una funzione
save_as
che aggiunge un nuovo pulsante al tuo Cambia pagina per salvare una nuova istanza di quell'oggetto.Non mi piace il modo in cui questa funzione funziona perché salverai un file copia identica dell'oggetto originale (se non si ottiene la convalida errori) non appena si fa clic su quel collegamento e se si dimentica di effettuare il piccole modifiche che volevi nel nuovo oggetto finirai con un duplicato dell'oggetto esistente.
D'altra parte, django-modelclone offre una visione intermedia, quella fondamentalmente pre-riempie il modulo per te. Quindi puoi modificare e quindi salvare una nuova istanza. O semplicemente vai via senza effetti collaterali.
Puoi anche applicare questo metodo: https://stackoverflow.com/a/4054256/7995920
Nel mio caso, con un vincolo univoco nel campo "nome", questa azione funziona e può essere richiesta da qualsiasi modulo:
def duplicate_jorn(modeladmin, request, queryset):
post_url = request.META['HTTP_REFERER']
for object in queryset:
object.id = None
object.name = object.name+'-b'
object.save()
return HttpResponseRedirect(post_url)