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


70

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

Ein Benutzer kann jedoch weiterhin auf ein Element klicken, und unten befindet sich der rote Link Löschen.

Antworten:


127

Einfach :)

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

9
Die Aktion befindet sich noch in der Dropdown-Liste, wirft jedoch eine verbotene 403. Um sie zu bereinigen, müssen Sie meiner Lösung folgen. Und mach das auch.
Radtek

Möchten Sie auch das Dropdown-Menü entfernen? Befolgen Sie in diesem Fall die Lösung von radtek
Kapuziner,

1
@radtek Sie haben Recht, dass die Aktion weiterhin in der Dropdown-Liste angezeigt wird, aber das OP hat angegeben, dass es ihm bereits gelungen ist, die ausgewählte Aktion zum Löschen zu deaktivieren. Das ist also alles was nötig ist.
McKay

Das ist in Ordnung, ich habe die komplette Lösung vor 2 Jahren veröffentlicht. Kein Problem.
Radtek

86

Wenn Sie eine bestimmte nicht benutzerdefinierte deaktivieren möchten, tun Sie dies. In Django 1.6.6 musste ich get_actionsplus define erweitern has_delete_permission. Die has_delete_permissionLösung beseitigt für mich nicht die Aktion aus dem Dropdown:

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

actions = ['your_custom_action']Wenn Sie es nicht einbeziehen, 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 jeden modelAdmin explizit einfügen müssen


2
Ich verstehe nicht, warum die Rückgabe von has_delete_permission als false die Aktion nicht beseitigt. Ich musste beides in Django 1.6.6
Radtek

2
Sie können einfach actions = Noneanstelle von verwenden get_actions().
dspacejs

Das würde alle Aktionen deaktivieren, nicht nur das Löschen, oder?
Radtek

Oh ja, du hast recht, mein böses lol. Ich habe diese Antwort verwendet, um alle Aktionen zu deaktivieren, aber Sie sollten in der Lage sein, die spezifischen Aktionen anzugeben, die Sie möchten
dspacejs

2
has_delete_permissionscheint mir genug zu sein, um das Löschen überall zu deaktivieren. del actions['delete_selected']löst einen Schlüsselfehler aus. Danke :)
Rami Alloush


9

Nun, Sie verwenden wahrscheinlich:

AdminSite.disable_action('delete_selected')

Zur weiteren Kontrolle implementieren Sie einfach Ihren eigenen Administrator und stellen seine Aktionen auf das ein, was Sie benötigen:

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

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


5
Funktioniert nicht Betrifft nicht die einzelne Seite. Deaktiviert einfach die Aktion beim Durchsuchen der Liste.
Peter Bengtsson


2

Die Lösungen hier sind bereits nett, aber ich bevorzuge es als wiederverwendbares Mixin, wie folgt:

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

Sie können dies in allen Ihren Administratoren verwenden, in denen Sie das Löschen wie folgt verhindern möchten:

class MyAdmin(NoDeleteAdminMixin, ModelAdmin):
    ...

0

Das ist sehr alt, aber es kann trotzdem jemandem helfen.

Angenommen, OPs

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

bezieht sich auf die rote Schaltfläche in der Ansicht "Ändern". Diese Schaltfläche kann durch Erweitern der ModelAdmin.change_viewMethode wie folgt entfernt werden:

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_saveund tun show_save_and_continue. Weitere Infos und Alternativen hier .

Beachten Sie auch, dass Django ab Version 2.1 über separate has_view_permission( Dokumente ) verfügt, die je nach Anwendungsfall möglicherweise eine bessere Option darstellen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.