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.

Peter Bengtsson
quelle

Antworten:

127

Einfach :)

class DeleteNotAllowedModelAdmin(admin.ModelAdmin):
    # Other stuff here
    def has_delete_permission(self, request, obj=None):
        return False
Jonathan R.
quelle
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

radtek
quelle
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
11

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

Aidas Bendoraitis
quelle
Dies funktioniert in Django 1.3 und früheren Versionen aufgrund dieses Problems nicht. Code.djangoproject.com/ticket/8060 Es ist in Django 1.4 behoben.
Teemu Kurppa
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

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

admin.site.disable_action('delete_selected')

Aus den Dokumenten

Lucas B.
quelle
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):
    ...
devsnd
quelle
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 .

djvg
quelle