Diciamo che ho un modello in cui la riga che ha un ID di 1 è speciale e non dovrebbe essere cancellata, ma tutte le altre righe vanno bene per cancellarle. Qui è il mio tentativo di attuazione di tale logica:Admin Django: has_delete_permission Ignorato per azione "Elimina"
models.py
from django.db import models
class Widget(models.Model):
name = models.CharField(max_length=255)
class Meta:
ordering = ('name',)
def __unicode__(self):
return self.name
admin.py
from django.contrib import admin
from .models import Widget
class WidgetAdmin(admin.ModelAdmin):
def has_delete_permission(self, request, obj=None):
return obj is None or obj.pk != 1
admin.site.register(Widget, WidgetAdmin)
Il codice di cui sopra rimuove il pulsante "Cancella" dalla forma cambiamento quando obj.pk
è 1
, che è quello che voglio. Tuttavia, nell'elenco delle modifiche, se spunta la casella di controllo per la riga con un ID di 1 e poi utilizzo l'azione "Elimina widget selezionati", sono in grado di eliminare quella riga. Voglio impedirlo, ma permetto comunque che tutte le altre righe vengano eliminate con l'azione "Elimina widget selezionati". Come posso fare questo?
Stavo per rispondere al tuo commento per dire che questo era probabilmente un ottimizzazione delle prestazioni in modo che l'azione possa usare 'queryset.delete()' invece di recuperare ogni istanza. Osservando il [codice sorgente] (https://github.com/django/django/blob/64aba7a8aba06b8be52a1a099b44e1d3be4bdd26/django/contrib/admin/actions.py#L46), tuttavia, si scopre che il queryset è iterato comunque! Ulteriori indagini rivelano che la tua preoccupazione esatta è stata [accettata, ma non trattata, bug] (https://code.djangoproject.com/ticket/11383) negli ultimi 7 anni. –
@KevinChristopherHenry Grazie per aver trovato quell'insetto! È bello sapere che questo è un problema noto. – Nick