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?
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 %}
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 button
name __ soit un navigateur approprié input
ou button
et soit marquée comme sûre avec Django.utils.safestring.mark_safe
. Vous pouvez également utiliser le filtre de modèle safe
ou accéder directement aux attributs de button
pour 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 ModelAdmin
facilement. 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 ModelAdmin
avec 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)
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')
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