Füge eine benutzerdefinierte Schaltfläche zu einer Admin-Seite der Django-Anwendung hinzu

Ich habe eine Anwendung in Django mit einer Routine, die nur für den Administrator verfügbar wäre. Ich bin ganz neu in der Python / Django Welt, also vielleicht meine Frage ist trivial. Was ich tun möchte, ist, eine Schaltfläche hinzuzufügen, um die Routine in diesem Anwendungsbereich der Admin-App auszuführen.

Ich bin ziemlich verwirrt von dort, nehme ich an, eine Vorlage dafür zu machen, und wenn es der Fall ist, wie füge ich eine HTML-Vorlage für eine App im Admin hinzu. Oder vielleicht gibt es einen Befehl, einfach einen Knopf hinzuzufügen?

Dank für Ihre Zeit

  • Google App Engine Such-API
  • Verwenden von basemap als eine Figur in einer Python-GUI
  • Aggregiere alle Dataframe-Zeilenpaar-Kombinationen mit Pandas
  • Wie und wo ein Modul in Python von Github installieren
  • '{0}' Format () ist schneller als str () und '{}' Format () mit IPython% Timeit und sonst mit reinen Python
  • Wie kann man Farbcodes von mIRC Benutzern ausgeben?
  • Wie schreibe ich String-Literale in Python, ohne ihnen zu entkommen?
  • Finden Sie den Gradienten eines Caffe conv-Filters in Bezug auf Eingabe
  • 4 Solutions collect form web for “Füge eine benutzerdefinierte Schaltfläche zu einer Admin-Seite der Django-Anwendung hinzu”

    Messing mit den Admin-Formularen kann kompliziert sein, aber ich habe häufig festgestellt, dass das Hinzufügen von Links, Schaltflächen oder zusätzliche Informationen ist einfach und hilfreich. (Wie eine Liste von Links zu verwandten Objekten ohne eine Inline, esp für Dinge, die mehr gesehen als bearbeitet).

    Von Django docs

    Aufgrund des modularen Aufbaus der Admin-Vorlagen ist es in der Regel weder notwendig noch ratsam, eine ganze Vorlage zu ersetzen. Es ist fast immer besser, nur den Abschnitt der Vorlage zu überschreiben, den du ändern musst.

    Dies wird eine Liste über die Oberseite des Formulars hinzufügen.

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

     {% extends "admin/change_form.html" %} {% block form_top %} {% for item in original.items %} {{ item }} {% endfor %} {% endblock %} 

    Django1.10:

    1) Override 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 django.utils.safestring.mark_safe button ein geeignetes Browser- input oder button Element ist und mit django.utils.safestring.mark_safe sicher django.utils.safestring.mark_safe . Alternativ können Sie den safe Vorlagenfilter verwenden oder direkt auf die Attribute der button zugreifen, um den <input> zu konstruieren. Meiner Meinung nach ist es besser, solche Dinge auf die Python-Ebene zu isolieren.

    2) Override 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 es Ihnen, Schaltflächen zu jedem ModelAdmin leicht hinzufügen. Alternativ zu Schritt (1) können Sie admin/change_form.html und den Block submit_row . Dies wäre etwas ausführlicher wegen der zusätzlichen Tags, die in der Vorlage benötigt werden.

    Wenn Sie möchten, dass die zusätzliche Aktion über alle Ihre Modelle (oder eine bestimmte Teilmenge) ModelAdmin dann Unterklasse ModelAdmin mit der gewünschten Funktionalität (ein Beispiel wäre, um die Archivierung zu Ihren Modellen hinzufügen.Sie könnten sogar eine Überschreibung für löschen – und die andere Standard-Schaltflächen – so dass der Modus anstatt gelöscht wird, dies erfordert einige Vorlagen-Änderungen)

    Sie können auch django-admin-tools verwenden , mit denen Sie die Admin-Vorderseite wie ein Dashboard einfach anpassen können. Mit einer LinkList können Sie auf eine Ansichtsmethode verweisen und überprüfen, ob der Benutzer authentifiziert ist. Es geht wie thies:

     # 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') 

    Verwirren Sie nicht mit den Admin-Seiten.

    1. Erstellen Sie hierfür eine "Applikation". Ja, deine Funktion ist nur eine "Routine". Das ist okay. Viele kleinere Anwendungen sind eine gute Sache.

    2. Diese Anwendung hat nichts Neues in models.py . Kein neues Modell Nullzeilen Code.

    3. Diese Anwendung hat eine nützliche URL in urls.py Etwas, das verwendet werden kann, um diese Admin-Seite anzuzeigen. Eine URL. Nicht viele Zeilen Code (weniger als ein Dutzend).

    4. Diese Anwendung hat eine View-Funktion in views.py . Bei "GET" präsentiert diese Ansichtsfunktion das Formular. Auf "POST", diese Ansicht Funktion macht die "Routine". Dies ist das "Herz" Ihrer Bewerbung. Der GET – natürlich – gibt einfach die Vorlage zur Anzeige zurück. Der POST macht die echte Arbeit und gibt einen endgültigen Status oder etwas zurück.

    Diese Ansichtsfunktion ist mit einem Dekorateur geschützt, so dass nur ein Administrator es ausführen kann. Siehe http://docs.djangoproject.com/de/1.2/topics/auth/#django.contrib.auth.decorators.user_passes_test . Sie wollen einen Test für ein Admin schreiben. lambda u: u.is_staff ist wohl das.

    1. Diese Anwendung hat eine Vorlage, die von der GET und POST präsentiert wird. Diese Vorlage hat dein Formular mit deiner Schaltfläche. Die, die man nicht einfach zu admin hinzufügen kann.

    2. Die tests.py ist ein Testfall mit zwei Benutzern, einer, der ein Admin ist und einer, der kein Admin ist.

    Kein Durcheinander mit eingebauten Admin-Seiten.

    Python ist die beste Programmiersprache der Welt.