2010-10-28 12 views

Répondre

9

Eh bien, vous utilisez probablement:

AdminSite.disable_action('delete_selected') 

Pour un contrôle plus juste mettre en œuvre votre propre administration et définir ses actions à 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

+4

ne fonctionne pas. N'affecte pas la page individuelle. Désactive simplement l'action lorsque vous parcourez la liste. –

10

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

+0

Cela ne fonctionne pas dans Django 1.3 et versions antérieures, à cause de ce problème https://code.djangoproject.com/ticket/8060 Il est corrigé dans Django 1.4. –

100

simple :)

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

L'action est toujours dans la liste déroulante, mais jette un 403. interdit Pour le nettoyer, vous devez suivre ma solution. Plus le faire aussi bien. – radtek

+0

Voulez-vous supprimer la liste déroulante, dans ce cas, suivez la solution de radtek – thevangelist

+1

@radtek Vous avez raison, l'action sera toujours dans la liste déroulante, mais l'OP a déclaré qu'il a déjà réussi à désactiver l'action de suppression sélectionnée . Donc c'est tout ce qui est nécessaire. – McKay

61

Si vous souhaitez désactiver un un particulier qui ne fait cette coutume. En django 1.6.6 j'ai dû étendre get_actions plus définir has_delete_permission. La solution has_delete_permission ne se débarrasse pas de l'action dans le menu déroulant 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 

Non compris dans actions = ['your_custom_action'], ne fonctionne que pour les actions personnalisés (defs) que vous avez définis pour ce modèle. La solution AdminSite.disable_action('delete_selected'), pour tous désactive les modèles, vous devrait inclure explicitement les plus tard par chaque modelAdmin

+1

Je ne comprends pas pourquoi retourner has_delete_permission comme faux ne se débarrasse pas de l'action. Je devais faire les deux en django 1.6.6 – radtek

1

admin.site.disable_action('delete_selected')

De l'docs