web-dev-qa-db-fra.com

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

J'ai une application dans Django avec une routine qui ne serait disponible que pour l'administrateur. Ce que je veux faire, c'est ajouter un bouton pour effectuer la routine dans la section de cette application de l'application admin.

Suis-je censé créer un modèle, et si c'est le cas, comment puis-je ajouter un modèle HTML pour une application dans l'administrateur? Ou peut-être y a-t-il une commande pour simplement ajouter un bouton?

18
Alexandre Deschamps

Il peut être compliqué de jouer avec les formulaires d'administration, mais j'ai souvent constaté qu'il est facile et utile d'ajouter des liens, des boutons ou des informations supplémentaires. (Par exemple, une liste de liens vers des objets liés sans créer d’inline, en particulier pour les éléments qui sont plus vus que modifiés).

De Django docs

En raison de la conception modulaire des modèles d’administrateur, il n’est généralement ni nécessaire ni conseillé de Remplacer un modèle entier. Il est Presque toujours préférable de remplacer uniquement La section du modèle que vous devez Modifier.

Cela ajoutera une liste en haut du formulaire.

Placez dans 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) Remplacer 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, bien entendu, que la représentation sous forme de chaîne de buttonname __ soit un navigateur approprié inputou buttonet soit marquée comme sûre avec Django.utils.safestring.mark_safe. Vous pouvez également utiliser le filtre de modèle safeou accéder directement aux attributs de buttonpour construire le <input>. À mon avis, il est préférable d'isoler de telles choses au niveau python. 

2) Remplacer 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 à n’importe quel ModelAdminfacilement. Alternativement à l'étape (1), vous pouvez étendre admin/change_form.html et remplacer le bloc submit_row. Cela serait légèrement plus détaillé en raison des balises supplémentaires requises dans le modèle. 

Si vous souhaitez que l'action supplémentaire soit disponible sur tous vos modèles (ou sur un sous-ensemble spécifique), sous-classe ModelAdminavec la fonctionnalité souhaitée (un exemple consisterait à ajouter de l'archivage à vos modèles. Vous pouvez même ajouter un remplacement pour la suppression - et l'autre boutons par défaut - pour que le mode soit archivé au lieu d'être supprimé (cela nécessiterait quelques modifications du modèle) 

10
DylanYoung

Vous pouvez également utiliser Django-admin-tools , qui vous permet de personnaliser facilement la page d'accueil de l'administrateur, à la manière d'un tableau de bord. À l'aide d'une LinkList, vous pouvez pointer sur une méthode d'affichage et vérifier si l'utilisateur est authentifié. Cela 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
saulobrito

Vous pouvez envisager d’ajouter une action d’administrateur personnalisée pour ce type d’objet (similaire à la fonction 'delete' intégrée), le cas échéant. Certains avantages incluent: "Django pur", ne pas avoir à manipuler les modèles et pouvoir agir sur plusieurs objets à la fois.

L’administrateur de Django vous permet d’écrire et d’enregistrer des «actions» - de simples fonctions Appelées avec une liste d’objets sélectionnés sur la page de liste de modifications . Si vous examinez une liste de modifications dans l’administrateur, vous verrez Voir cette fonctionnalité en action; Django est livré avec une action «supprimer les objets Sélectionnés» 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 la façon d'ajouter un bouton d'action personnalisé, qui est une autre réponse tous ensemble. J'ai cependant réussi à me débrouiller avec les actions intégrées les plus simples.

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

0
John Lehmann