web-dev-qa-db-de.com

Fügen Sie der Administrationsseite einer Django-Anwendung eine benutzerdefinierte Schaltfläche hinzu

Ich habe eine Anwendung in Django mit einer Routine, die nur dem Administrator zur Verfügung stehen würde. Ich möchte eine Schaltfläche hinzufügen, um die Routine im Abschnitt dieser Anwendung der Admin-App auszuführen.

Soll ich eine Vorlage dafür erstellen, und wenn dies der Fall ist, wie füge ich eine HTML-Vorlage für eine App im Administrator hinzu? Oder vielleicht gibt es einen Befehl, um einfach eine Schaltfläche hinzuzufügen?

18

Mit den Admin-Formularen zu spielen kann kompliziert sein, aber ich habe im Allgemeinen festgestellt, dass das Hinzufügen von Links, Schaltflächen oder zusätzlichen Informationen einfach und hilfreich ist. (Wie eine Liste von Links zu verwandten Objekten, ohne dass eine Inline erstellt wird, vor allem für Dinge, die eher betrachtet als bearbeitet werden).

Von Django-Dokumente

Aufgrund des modularen Aufbaus der Admin-Vorlagen ist es in der Regel Weder erforderlich noch ratsam, Eine gesamte Vorlage zu ersetzen. Es ist Fast immer besser, nur Den Abschnitt der Vorlage zu überschreiben, den Sie Ändern müssen.

Dadurch wird eine Liste über dem Formular hinzugefügt.

Platzieren in templates/admin/[your_app]/[template_to_override]:

{% extends "admin/change_form.html" %}

{% block form_top %}

{% for item in original.items %}
  {{ item }}
{% endfor %}

{% endblock %}
13
Lincoln B

Django1.10:

1) Überschreiben von admin/submit_line.html:

{% load i18n admin_urls %}
<div class="submit-row">
{% if extra_buttons %}
    {% for button in extra_buttons %}
        {{ button }}
    {% endfor %}
{% endif %}
{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />{% endif %}
{% if show_delete_link %}
    {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
    <p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% trans "Delete" %}</a></p>
{% endif %}
{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" />{% endif %}
{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" />{% endif %}
{% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" />{% endif %}
</div>

Dies setzt natürlich voraus, dass die Zeichenfolgendarstellung von button ein geeignetes Browserelement input oder button ist und mit Django.utils.safestring.mark_safe als sicher gekennzeichnet ist. Alternativ können Sie den Vorlagenfilter safe verwenden oder direkt auf die Attribute von button zugreifen, um den <input> zu erstellen. Meiner Meinung nach ist es besser, solche Dinge auf die Python-Ebene zu isolieren. 

2) Überschreiben von MyModelAdmin.change_view:

def change_view(self, request, object_id, form_url='', extra_context=None):
    extra_context = extra_context or self.extra_context()
    return super(PollAdmin, self).change_view(
        request, object_id, form_url, extra_context=extra_context,
    )

Diese Methode ermöglicht das einfache Hinzufügen von Schaltflächen zu jeder ModelAdmin. Alternativ zu Schritt (1) können Sie admin/change_form.html erweitern und den Block submit_row überschreiben. Dies wäre etwas ausführlicher, da in der Vorlage zusätzliche Tags erforderlich sind. 

Wenn Sie die zusätzliche Aktion für alle Ihre Modelle (oder eine bestimmte Teilmenge) zur Verfügung stellen möchten, müssen Sie die Unterklasse ModelAdmin mit der gewünschten Funktionalität verwenden (ein Beispiel wäre das Hinzufügen von Archivierung zu Ihren Modellen. Sie können sogar eine Überschreibung für das Löschen hinzufügen - und die andere.) Standardschaltflächen - so wird der Modus archiviert anstatt gelöscht; dies würde einige Änderungen an der Vorlage erfordern. 

10
DylanYoung

Sie können auch Django-admin-tools verwenden, um die Admin-Startseite auf einfache Weise wie ein Dashboard anzupassen. Mit einer LinkList können Sie auf eine Ansichtsmethode zeigen und prüfen, ob der Benutzer authentifiziert ist. Es geht wie diese:

# dashboard.py (read more about how to create one on Django-admin-tools docs)
class CustomIndexDashboard(Dashboard):
    """
    Custom index dashboard for captr.
    """
    def init_with_context(self, context):
        self.children.append(modules.LinkList(
            _('Tasks'),
            children=[
                ['Your task name', '/task']
            ]
        ))

# urls.py (mapping uri to your view function)
urlpatterns += patterns('yourapp.views',
    (r'^task$', 'task'),
)

# views.py
def task(request):
    if request.user.is_authenticated():
        update_definitions_task.delay() # do your thing here. in my case I'm using Django-celery for messaging

    return redirect('/admin')
2
saulobrito

Fügen Sie gegebenenfalls eine custom admin action für diese Art von Objekt hinzu (ähnlich dem eingebauten 'delete'). Einige Vorteile sind: "pure Django", nicht mit Vorlagen verwirren zu müssen und auf mehrere Objekte gleichzeitig reagieren zu können.

Mit dem Administrator von Django können Sie "Aktionen" schreiben und registrieren - einfache Funktionen, die mit einer Liste von Objekten aufgerufen werden, die auf der Änderungslistenseite Ausgewählt sind. Wenn Sie sich eine Änderungsliste im Administrator ansehen, sehen Sie Diese Funktion in Aktion. Django wird mit einer für alle Modelle verfügbaren Aktion "Ausgewählte Objekte löschen.".

https://docs.djangoproject.com/de/dev/ref/contrib/admin/actions/

Ich habe die Idee aus diesem Artikel bekommen, wie man eine benutzerdefinierte Aktionsschaltfläche hinzufügt. Dies ist eine weitere Antwort. Ich konnte jedoch mit den einfacheren integrierten Aktionen auskommen.

https://medium.com/@hakibenita/how-to-add-custom-action-buttons-to-Django-admin-8d266f5b0d41

0
John Lehmann