web-dev-qa-db-fra.com

Dans Django Admin, comment désactiver le lien Supprimer

J'ai réussi à désactiver l'action "Supprimer la sélection". Facile. 

Mais un utilisateur peut toujours cliquer sur un élément, puis sur le lien Supprimer en rouge situé en bas. 

56
Peter Bengtsson

Simple :)

class DeleteNotAllowedModelAdmin(admin.ModelAdmin):
    # Other stuff here
    def has_delete_permission(self, request, obj=None):
        return False
104
Jonathan R.

Si vous souhaitez en désactiver un spécifique non personnalisé, faites-le. Dans Django 1.6.6, j'ai dû étendre get_actions et définir has_delete_permission. La solution has_delete_permission ne supprime pas l'action de la liste déroulante pour moi:

class MyModelAdmin(admin.ModelAdmin):

    ....

    def get_actions(self, request):
        #Disable delete
        actions = super(MyModelAdmin, self).get_actions(request)
        del actions['delete_selected']
        return actions

    def has_delete_permission(self, request, obj=None):
        #Disable delete
        return False

Sans l'inclure dans actions = ['your_custom_action'], ne fonctionne que pour les actions personnalisées (defs) que vous avez définies pour ce modèle. La solution AdminSite.disable_action('delete_selected') la désactive pour tous les modèles. Vous devrez donc les inclure explicitement plus tard pour chaque modèleAdmin.

70
radtek

Désactivez simplement l'autorisation yourapp.delete_yourmodel pour cet utilisateur ou le groupe auquel il appartient.

11
Aidas Bendoraitis

Eh bien, vous utilisez probablement:

AdminSite.disable_action('delete_selected')

Pour plus de contrôle, implémentez votre propre administrateur et définissez ses actions sur tout ce dont vous avez besoin:

class MyModelAdmin(admin.ModelAdmin):
    actions = ['whatever', 'actions']

Référence: http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-a-site-wide-action

9
Yuval Adam

C'est très vieux, mais ça peut quand même aider quelqu'un. 

En supposant que les OP 

... l'utilisateur peut toujours cliquer sur un élément, suivi du lien rouge Supprimer en bas.

fait référence au bouton rouge dans la vue "changer". Ce bouton peut être supprimé en étendant la méthode ModelAdmin.change_view comme suit:

def change_view(self, request, object_id=None, form_url='', extra_context=None):
    return super().change_view(request, object_id, form_url,
                               extra_context=dict(show_delete=False))

Vous pouvez faire la même chose avec show_save et show_save_and_continue. Plus d'infos et alternatives ici .

Notez également que Django 2.1 a maintenant un has_view_permission ( docs ) séparé, qui peut être une meilleure option, selon votre cas d'utilisation.

0
djvg

Les solutions ici sont déjà Nice, mais je préfère l’avoir comme un mix réutilisable, comme ceci:

class NoDeleteAdminMixin:
    def has_delete_permission(self, request, obj=None):
        return False

Vous pouvez utiliser ceci dans tous vos administrateurs où vous souhaitez empêcher la suppression, comme ceci:

class MyAdmin(NoDeleteAdminMixin, ModelAdmin):
    ...
0
devsnd