2012-02-13 3 views
2
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: сообщение об успешном удалении, даже если удаление запрещено

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

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

NB: Эта модель предназначена только для django-admin.

+1

Я не уверен, что это возможно, так как код, отображающий сообщение, не проверяет возвращаемое значение из 'delete'. –

ответ

2

Можно удалить вид в Джанго администратора не проверяет, чтобы увидеть, если 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) 

Реализация выше отключит «удалить выбранные объекты» admin action, как вернуть значение False, когда OBJ нет. Вы все равно должны это делать, поскольку он вызывает метод удаления запроса, а не метод переопределенного удаления.

При таком подходе суперадмины все равно смогут удалять события, поскольку у них есть все разрешения. Я не думаю, что этот подход будет работать, если SomeModel появится в линейке моделей - хотя я вижу, что has_delete_permission - это опция InlineModelAdmin в Django 1.4.

+0

Спасибо. Это спасение. Я пошел на переопределение has_delete_permission, потому что я использую его только в admin. Я уже переопределил get_action(), чтобы отключить действие «удалить выбранный объект». Так что это не проблема для меня. – kra3

0

Вы можете вернуть 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 
+0

Это тоже не работает. Я пробовал это раньше. Я использую Django 1.3.1, если это помогает. – kra3

Смежные вопросы