Представление удаления в администраторе django не проверяет, был ли вызов delete()
успешным, поэтому, если вы хотите переопределить метод удаления, как в вашем вопросе, вам нужно переопределить весь ModelAdmin.delete_view
метод.
Если SomeModel
используется только в админке Django, другой возможный подход - переопределить метод has_delete_permission
. Это приведет к удалению ссылок на удаление из представления изменений и отключению страницы удаления для событий в прошлом.
class SomeModelAdmin(admin.ModelAdmin):
...
def has_delete_permission(self, request, obj=None):
"""
Return False for events in the past
"""
if obj is None:
# obj is None in the model admin changelist view
return False
now = datetime.datetime.now()
if obj.end < now:
return False # past events cannot be deleted
else:
return super(SomeModelAdmin, self).has_delete_permission(request, obj)
Приведенная выше реализация отключит «удаление выбранных объектов» действие администратора , поскольку мы возвращаем False, когда для obj установлено значение None. В любом случае вам следует подумать об этом, так как он вызывает метод удаления набора запросов, а не переопределенный метод удаления.
При таком подходе superadmins по-прежнему сможет удалять события, поскольку у них есть все разрешения. Я не думаю, что этот подход сработает, если в строках модели появится SomeModel
- хотя я вижу, что has_delete_permission
- это опция InlineModelAdmin
в Django 1.4.