Ich habe bereits eine benutzerdefinierte Admin-Aktion für mein Modell definiert, die perfekt wie erwartet funktioniert. Ich habe auch verschiedene Möglichkeiten zum Hinzufügen einer Schaltfläche zur Admin Formularseite hier auf SO untersucht. Der einzige Schritt, den ich vermisse, ist, wie man eine Schaltfläche in der Änderungsformularseite ausführt, um meine benutzerdefinierte Admin-Aktion mit dem aktuellen Objekt auszuführen.Django: Wie füge ich eine benutzerdefinierte Schaltfläche zur Admin-Formularseite hinzu, die eine Admin-Aktion ausführt?
Ziel ist es, dem Administrator zu ermöglichen, jedes Objekt einzeln zu prüfen und eine Aktion auszuführen, ohne zur Listenansicht zurückkehren zu müssen, das geprüfte Objekt auszuwählen und die Aktion aus der Liste auszuführen.
Meine benutzerdefinierten Admin-Aktion sieht wie folgt aus:
def admin_apply_change(modeladmin, request, queryset):
# loop over objects in query set and perform action
ich dort gehe davon eine einfache und saubere Art und Weise ist diese Aktion in Admin ändern Form des Aufrufs, in dem die queryset
nur die zur Zeit den Admin geöffnet enthalten würde Objekt schaut an.
HINWEIS: Es wäre vorzuziehen, wenn die Schaltfläche am unteren Rand des Änderungsformulars neben Save
Schaltfläche statt oben mit History
Schaltfläche ist, die nicht sehr sichtbar ist.
Lösung
Siehe Antwort von Remi für die Lösung. Um sich zu machen, arbeiten die folgenden Korrekturen erforderlich:
1: In der Überschreibung von response_change
Initialisierung einiger Variablen fehlt:
opts = self.model._meta
pk_value = obj._get_pk_val()
preserved_filters = self.get_preserved_filters(request)
2: Neuaufnahme Tag custom_submit_row
in templatetags platziert werden soll und nicht in admin (siehe docs for custom templatetags)
3: Dies ist das Versehen, auf das Sie etwas Zeit verlieren könnten. In change_form.html
Sie nicht nur die vorgeschlagene Linie ändern müssen:
{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %}
, sondern auch die wichtigeren Linie am unteren Rand, wo submit_row
erscheint:
{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
(es befindet sich direkt über dem Javascript-Block in change_form.html
Danke. Dies löste mein Problem und einige kleinere Korrekturen. Sehen Sie sie in meiner Frage aktualisieren. Es wäre schön, wenn Sie Ihre Antwort aktualisieren könnten, um diese Korrekturen zu übernehmen. – dsalaj