Gibt es in der Django-Administrationsoberfläche eine Möglichkeit, ein Element zu duplizieren?

71

Sie fragen sich nur, ob es eine einfache Möglichkeit gibt, die Funktionalität zum Duplizieren eines vorhandenen Eintrags in der Administrationsoberfläche hinzuzufügen?

Bei der Dateneingabe sind wir auf eine Situation gestoßen, in der viele Elemente generische Daten mit einem anderen Element teilen. Um Zeit zu sparen, wäre es sehr schön, eine vorhandene Liste schnell zu duplizieren und nur die geänderten Daten zu ändern. Die Verwendung einer besseren Modellstruktur wäre eine Möglichkeit, die Duplizierung der Daten zu verringern. Es kann jedoch vorkommen, dass die duplizierten Daten in Zukunft individuell geändert werden müssen.

sesh
quelle

Antworten:

120

You can save as by just enabling adding this to your ModelAdmin:

save_as = True

This replaces the "Save and add another" button with a "Save as" button. "Save as" means the object will be saved as a new object (with a new ID), rather than the old object.

Harley Holcombe
quelle
2
Die Implementierung war für mich nicht offensichtlich und ich fand heraus, dass der Abschnitt einer anderen Frage mit dem Titel "Beispiel admin.py" zeigt, dass Sie von ModelAdmin ableiten und dann die admin.site.register(Person, PersonAdmin)(wenn PersonAdmin Ihre abgeleitete Klasse ist) verwenden müssen, anstattadmin.site.register(Person)
sage
8

Hier gibt es eine bessere (aber nicht integrierte) Lösung:

https://github.com/RealGeeks/django-modelclone

Aus ihrer README:

Django Admin hat eine save_as Funktion, die Ihrer Änderungsseite eine neue Schaltfläche hinzufügt, um eine neue Instanz dieses Objekts zu speichern.

Die Funktionsweise dieser Funktion gefällt mir nicht, da Sie eine identische Kopie des Originalobjekts speichern (wenn Sie keine Validierungsfehler erhalten), sobald Sie auf diesen Link klicken und vergessen, die kleinen Änderungen vorzunehmen, die Sie vorgenommen haben Wenn Sie das neue Objekt suchen, erhalten Sie ein Duplikat des vorhandenen Objekts.

Auf der anderen Seite bietet django-modelclone eine Zwischenansicht, die das Formular grundsätzlich für Sie ausfüllt. So können Sie eine neue Instanz ändern und dann speichern. Oder gehen Sie einfach ohne Nebenwirkungen weg.

kontextifizieren
quelle
0

Sie können diese Methode auch anwenden: https://stackoverflow.com/a/4054256/7995920

In meinem Fall funktioniert diese Aktion mit einer eindeutigen Einschränkung im Feld "Name" und kann in jeder Form angefordert werden:


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)

Abel
quelle