web-dev-qa-db-de.com

Wie deaktiviere ich den Link Löschen in Django Admin?

Ich habe es geschafft, die Aktion "Ausgewählte löschen" zu deaktivieren. Einfach. 

Ein Benutzer kann jedoch immer noch auf ein Element klicken und dann unten am roten Lösch-Link. 

56
Peter Bengtsson

Einfach :)

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

Wenn Sie eine bestimmte deaktivieren möchten, die nicht benutzerdefiniert ist, tun Sie dies. In Django 1.6.6 musste ich get_actions erweitern und has_delete_permission definieren. Die has_delete_permission-Lösung entfernt die Aktion aus der Dropdown-Liste für mich nicht:

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

Wenn es nicht in actions = ['your_custom_action'] enthalten ist, funktioniert es nur für die benutzerdefinierten Aktionen (defs), die Sie für dieses Modell definiert haben. Die Lösung AdminSite.disable_action('delete_selected') deaktiviert sie für alle Modelle, sodass Sie sie später für jedes modelAdmin explizit hinzufügen müssen

70
radtek

Deaktivieren Sie einfach die yourapp.delete_yourmodel-Berechtigung für diesen Benutzer oder die Gruppe, zu der er gehört.

11

Nun, Sie verwenden wahrscheinlich:

AdminSite.disable_action('delete_selected')

Zur weiteren Kontrolle implementieren Sie einfach Ihren eigenen Administrator und legen Sie die gewünschten Aktionen fest:

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

Referenz: http://docs.djangoproject.com/de/dev/ref/contrib/admin/actions/#disabling-a-site-wide-action

9
Yuval Adam

admin.site.disable_action('delete_selected')

Aus dem docs

2
Lucas B

Das ist sehr alt, aber es kann jemandem helfen. 

Angenommen, diese OPs 

Der Benutzer kann immer noch auf ein Element klicken und dann unten den roten Link "Löschen".

bezieht sich auf die rote Schaltfläche in der Ansicht "Ändern". Diese Schaltfläche kann entfernt werden, indem die ModelAdmin.change_view-Methode wie folgt erweitert wird:

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))

Sie können dasselbe mit show_save und show_save_and_continue tun. Weitere Infos und Alternativen hier .

Beachten Sie auch, dass Django 2.1 jetzt einen separaten has_view_permission ( docs ) hat, wobei je nach Anwendungsfall die bessere Option sein kann.

0
djvg

Die Lösungen hier sind schon nett, aber ich bevorzuge es als wiederverwendbare Mischung, wie folgt:

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

Sie können dies in all Ihren Admins verwenden, bei denen Sie das Löschen verhindern möchten:

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