Django: Получение успешно удаленного сообщения, даже если удаление запрещено - PullRequest
2 голосов
/ 13 февраля 2012
class SomeModel(models.Model):
    end = models.DateTimeField()

    def delete(self, *args, **kwargs):
        now = datetime.datetime.now()
        if self.end < now:
            return  # past events cannot be deleted

        super(SomeModel, self).delete(self, *args, **kwargs)

Я написал приведенный выше код в одной из моих моделей. Работает красиво, но с одной проблемой:

Я получаю сообщение о том, что объект успешно удален, даже если эта модель не удалена, потому что если условие, которое я ввел.

Есть ли способ отправить сообщение о том, что объект не удаляется в этом случае?

Примечание: эта модель только для администратора django.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Представление удаления в администраторе 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.

0 голосов
/ 13 февраля 2012

Вы можете вернуть True или False из переопределенного delete () и просто поработать со значением этого в вашей форме, чтобы создать ваше сообщение.

def delete(self, *args, **kwargs):
    now = datetime.datetime.now()
    if self.end < now:
        return False  # past events cannot be deleted

    super(SomeModel, self).delete(self, *args, **kwargs)
    return True #successfully deleted from the database
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...