Ajouter un bouton personnalisé à la page d'administration D'une application Django

J'ai une application à Django avec une routine qui ne serait disponible qu'à l'administrateur. Ce que je veux faire est d'ajouter un bouton pour exécuter la routine dans cette application l'article de l'admin app.

Suis-je censé faire d'un modèle pour elle, et si c'est le cas, comment puis-je ajouter un gabarit html pour une application dans l'admin. Ou peut-être qu'il y a une commande pour simplement ajouter un bouton?

17
demandé sur Francisco Couzo 2010-09-23 20:58:07

5 réponses

jouer avec les formulaires d'administration peut être compliqué, mais j'ai souvent trouvé que l'ajout de liens, de boutons, ou d'informations supplémentaires est facile et utile. (Comme une liste de liens vers des objets apparentés sans faire un inline, esp pour les choses qui sont plus vues que éditées).

Django docs

Raison de la conception modulaire des modèles d'administration, il est généralement ni nécessaire ni conseillé de remplacer tout un modèle. Il est presque toujours mieux de remplacer uniquement la section du modèle qui vous besoin de changer.

ceci ajoutera une liste en haut du formulaire.

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

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

{% block form_top %}

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

{% endblock %}
13
répondu Lincoln B 2015-11-11 16:54:45

Django1.10:

1) outrepasser 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>

Cela suppose, naturellement, que button'représentation de chaîne est un navigateur approprié input ou button élément, et est marqué sûr avec django.utils.safestring.mark_safe. Vous pouvez aussi utiliser le safe filtre de template ou accédez aux attributs de button directement pour construire l' <input>. À mon avis, il est préférable d'isoler de telles choses au niveau python.

2) outrepasser 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,
    )

Cette méthode vous permet d'ajouter des boutons à tout ModelAdmin facilement. Sinon à l'étape (1), vous pouvez étendre admin/change_form.html et remplacer le bloc submit_row. Ce serait un peu plus verbeux en raison des étiquettes supplémentaires nécessaires dans le modèle.

si vous voulez l'action supplémentaire disponible sur tous vos modèles (ou un sous-ensemble spécifique) alors la sous-classe ModelAdmin avec la fonctionnalité désirée (un exemple serait d'ajouter l'archivage de vos modèles. Vous pourriez même ajouter un outrepasser pour supprimer -- et les autres boutons par défaut--de sorte que le mode soit archivé au lieu de supprimé; cela nécessiterait quelques modifications de modèle)

10
répondu DylanYoung 2017-03-10 13:48:40

Vous pouvez aussi utiliser django-admin-outils, ce qui vous permet de personnaliser facilement la page d'accueil admin comme un tableau de bord. En utilisant une LinkList, vous pouvez pointer vers une méthode de vue et vérifier si l'utilisateur est authentifié. Il va comme 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')
2
répondu saulobrito 2013-08-19 12:58:42

Vous pourriez envisager d'ajouter un custom admin action pour ce type d'objet (similaire à l'élément 'delete'), s'il y a lieu. Certains avantages comprennent: "pur Django", ne pas avoir à jouer avec les gabarits, et être en mesure d'agir sur plusieurs objets à la fois.

L'administrateur de Django vous permet d'écrire et d'enregistrer "actions" - simple fonctions qui sont appelées avec une liste d'objets sélectionnés sur le modifier la page de la liste. Si vous regardez une liste de modifications dans l'administrateur, vous aurez voir cette fonctionnalité dans l'action, Django est livré avec un "supprimer la sélection les objets" action disponible pour tous les modèles.

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

j'ai eu l'idée de cet article sur comment ajouter un bouton d'action personnalisé, qui est une autre réponse tous ensemble. J'ai pu me débrouiller avec les actions intégrées plus simples bien.

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

0
répondu John Lehmann 2018-01-31 15:31:11

ne jouez pas avec les pages d'administration.

  1. Créer une "application" pour ce. Oui, votre fonction n'est qu'une"routine". Ce n'est pas grave. Beaucoup de petites applications sont une bonne chose.

  2. Cette application n'a rien de nouveau dans models.py. Pas de nouveau modèle. Zéro Ligne de code.

  3. cette application a une URL utile dans urls.py. Quelque chose qui peut être utilisé pour afficher cette page admin. Une adresse URL. Peu de lignes de code (moins d'une douzaine.)

  4. cette application a une fonction de vue dans views.py. Sur "GET", cette fonction de vue présente le formulaire. Sur "POST", cette fonction de vue fait la"routine". C'est le "cœur" de votre application. Le GET -- bien sûr -- retourne simplement le template pour l'affichage. Le POST ne le vrai travail, et renvoie un état final ou quelque chose.

cette fonction de vue est protégée avec un décorateur de sorte que seul un administrateur peut l'exécuter. Voir http://docs.djangoproject.com/en/1.2/topics/auth/#django.contrib.auth.decorators.user_passes_test. Vous voulez faire un test pour être un administrateur. lambda u: u.is_staff est probablement.

  1. cette application a un modèle, présenté par le GET et le POST. Ce modèle a votre formulaire avec votre bouton. Celui que vous ne pouvez pas ajouter à admin facilement.

  2. tests.py est un cas de test avec deux utilisateurs, un administrateur et un qui n'est pas un admin.

ne jouez pas avec les pages d'administration intégrées.

-26
répondu S.Lott 2010-09-23 17:15:19