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.
Simple :)
class DeleteNotAllowedModelAdmin(admin.ModelAdmin):
# Other stuff here
def has_delete_permission(self, request, obj=None):
return False
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.
Désactivez simplement l'autorisation yourapp.delete_yourmodel
pour cet utilisateur ou le groupe auquel il appartient.
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
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.
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):
...