2012-02-10 42 views
1

有沒有辦法阻止用戶刪除某個類型的最後一個對象(即表中的最後一行)?他們仍然應該能夠一般地刪除這種對象,但必須確保至少有一個條目留下 - 在這種特定情況下,至少有一個條目與用戶相關聯。在Django admin中,如何防止刪除類型的最後一個對象

我試圖重寫模式的刪除功能:

def delete(self, *args, **kwargs): 
    others = Presentation.objects.filter(user=self.user).exclude(pk=self.pk) 
    if len(others) < 1: 
     pass 
    else: 
     super(Presentation, self).delete(*args, **kwargs) 

這工作,但用戶被告知缺失實際上是成功的。我寧願要顯示錯誤消息,例如驗證失敗時。但是,據我所知,驗證只適用於保存。

回答

2

你也可以試試這個嗎?

# admin.py 
class MyModelAdmin(admin.ModelAdmin): 
    def delete_model(self, request, obj): 
     if last_record: 
       storage = messages.get_messages(request) 
       storage.used = True 
       messages.error(request, 'Cannot delete last record.') 
     else: 
       obj.delete() 

另一個選擇可能是隱藏成功消息div或跨度與jQuery。

+0

這沒有奏效。 'clean()'顯然是在保存時調用的,而不是在刪除時調用。 – pholz 2012-02-14 09:21:07

+0

是的,這是有道理的。沒有理由清除任何刪除。我的錯。 – 2012-02-14 14:14:58

+0

我已經更新了我的答案 – 2012-02-14 14:24:10

1

我建議你另一種方法:

1)創建和連接信號pre_delete,提高和異常您的病情:

def on_delete(sender,**kwargs): 
    if <condition>: 
     raise Exception('Abort delete') 
    #else: continue and delete 

pre_delete.connect(on_delete,sender=Presentation) 

2)然後,在視圖中,可以趕上此異常

# view code... 
try: 
    object.delete() 
except: 
    # add the desired info to context 

無論如何,你也可以覆蓋model::delete拋出異常,並抓住它的視圖代碼。

+0

你對「視圖」有什麼意思?我不使用自定義視圖,而是使用內置的django管理視圖和內置模板。我是否必須編寫自定義視圖併爲此使用自定義模板? – pholz 2012-02-10 11:27:35

+0

如果你是**只有**在管理中使用此內置視圖和模板,然後dan-klasson的方法更好,因爲表單錯誤已經顯示在管理模板中....但要小心,導致任何其他刪除操作不通過此管理表單不會檢查您的條件:S – jgsogo 2012-02-12 12:19:02

相關問題