2012-02-13 64 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:即使刪除被阻止也能成功刪除郵件

我得到一個消息說,對象刪除成功,即使該模式沒有被刪除,因爲如果我把情況

有沒有一種方法,我可以發送消息,在這種情況下對象不被刪除?

注意:此模型僅適用於django-admin。

+1

我不確定這是否可能,因爲顯示消息的代碼不檢查來自'delete'的返回值。 – 2012-02-13 17:01:26

回答

2

在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) 

的實施將禁用「刪除所選對象」。admin action,當我們返回False當obj爲無。無論如何,您應該考慮這樣做,因爲它調用queryset delete方法,而不是您的重寫刪除方法。

使用這種方法,superadmins仍然可以刪除具有所有權限的事件。如果SomeModel出現在模型內聯中,我不認爲這種方法可行 - 儘管我在Django 1.4中看到has_delete_permissionInlineModelAdmin選項。

+0

謝謝。這是一個保存。 我不理睬has_delete_permission,因爲我只在管理員中使用它。 我已經重寫了get_action()來禁用'delete selected object'操作。所以這對我來說不是問題。 – kra3 2012-02-14 05:19:56

0

您可以從覆蓋的delete()中返回True或False,只需使用表單中的值來構建消息。

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 2012-02-13 16:33:29