Django admin: überschreiben der delete-Methode
Habe ich admin.py wie folgt:
class profilesAdmin(admin.ModelAdmin):
list_display = ["type","username","domain_name"]
Nun möchte ich zu einer Aktion vor dem löschen des Objekts:
class profilesAdmin(admin.ModelAdmin):
list_display = ["type","username","domain_name"]
@receiver(pre_delete, sender=profile)
def _profile_delete(sender, instance, **kwargs):
filename=object.profile_name+".xml"
os.remove(os.path.join(object.type,filename))
Wenn ich löschen signal-Methode wie diese, bekomme ich eine Fehlermeldung self
sollte der erste parameter.
Wie kann ich ändern, die oben genannten Funktion?
Und ich will zum abrufen der Profilname des Objekts gelöscht werden. Wie kann das getan werden?
Ich habe auch versucht das überschreiben delete_model Methode:
def delete_model(self, request, object):
filename=object.profile_name+".xml"
os.remove(os.path.join(object.type,filename))
object.delete()
Aber diese schien das nicht funktionieren, wenn mehrere Objekte gelöscht werden müssen, in einem Schuss.
Trotzdem bekomme ich den Fehler selbst nicht definiert
InformationsquelleAutor arjun | 2013-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist auf dem richtigen Weg mit Ihrem
delete_model
Methode. Wenn der django-admin führt eine Aktion auf mehrere Objekte gleichzeitig verwendet er die update-Funktion. Jedoch, wie Sie sehen in der Dokumentation dieser Aktionen durchgeführt werden, die auf Datenbankebene nur mit SQL.Müssen Sie Ihre
delete_model
Methode als benutzerdefinierte Aktion in der django-admin.Fügen Sie dann Ihre Funktion, um Ihre modeladmin -
Hoppla, copy und paste Fehler - habe ich aktualisiert meine Antwort.
Dies wirft einen Fehler aus, wenn nur ein Objekt gelöscht werden soll. Gibt den Fehler'_profile' - Objekt ist nicht durchsuchbar. Auch die Aktionen-Liste haben die 2 Werte. Man ist delete_model und der andere löscht die ausgewählten profile.
Ja, Sie benötigen eine Funktion zu verwenden, in der modeladmin Aktionen und eine für einzelne Objekte (ich glaube, das haben Sie ja schon-Funktion). Ist es ein problem, dass zwei Aktionen in der Aktionen-Liste?
Ja, Also ich habe geschrieben eine Funktion löschen Sie die zusätzliche Aktion aus der Liste aus. So es funktioniert jetzt. Danke
InformationsquelleAutor Aidan Ewen
Das Hauptproblem ist, dass der Django-admin-bulk-delete-verwendet SQL-Instanz nicht.löschen(), wie anderswo. Für eine admin-only-Lösung, die folgende Lösung bewahrt die Django-admin "wollen Sie wirklich löschen" interstitial.
Die Allgemeine Lösung ist das überschreiben der queryset zurückgegeben von der Modell - manager abfangen, löschen.
InformationsquelleAutor Scott A
versuchen Sie überschreiben delete_model Methode ist fehlgeschlagen, da beim löschen mehrere Objekte, die django benutzen
QuerySet.delete()
,aus Gründen der Effizienz Ihres Modellsdelete()
Methode nicht aufgerufen werden.können Sie sehen, es gibt https://docs.djangoproject.com/en/1.9/ref/contrib/admin/actions/
Uhr Beginn Warnung
Admin
delete_model()
ist dasselbe wie das Modell derdelete()
https://github.com/django/django/blob/master/django/contrib/admin/options.py#L1005
also, wenn Sie löschen Sie mehrere Objekte, können Sie benutzerdefinierte die delete-Methode wird nie anrufen.
haben Sie zwei Wege.
1.benutzerdefinierte Aktion löschen.
Aktion aufrufen Modell.delete() für jede der ausgewählten Elemente.
2.verwenden signal.
Sie können signal allein nicht in der Klasse.
können Sie auch sehen diese Frage Django Modell: delete() nicht ausgelöst
InformationsquelleAutor xavierskip
Ihre Methode sollte
Sollten Sie fügen Sie eine Referenz zum aktuellen Objekt als erstes argument in jeder Signatur der Methode (in der Regel genannt
self
). Auch die delete_model implementiert werden sollten als eine Methode.InformationsquelleAutor pram