2014-10-10 63 views
1

我試圖觸發管理後端出現的錯誤,當您嘗試刪除模型實例時。如果我用下面的信號,要做到這一點,我的問題是,它拋出一個500錯誤,而不是發佈表單內一個漂亮的錯誤消息:從管理員表單中的pre_delete信號渲染ValidationError?

@receiver(models.signals.pre_delete, sender=MyInvincibleModel) 
def execute_before_delete(sender, instance, using, *args, **kwargs): 
    # some logic 
     raise ValidationError("Nooo, I don't want to die!!") 

但是,如果我提出一個ValidationError模型的清潔方法它在表單本身中顯示爲一個很好的錯誤信息。這樣做的問題是我不知道如何讓clean方法檢查一下是否有一個實例被刪除。如果我有一個自定義的ModelForm的設置,我可以做這樣的事情:

for cleaned_data in self.cleaned_data: 
    if cleaned_data.get('DELETE', True): 
     raise ValidationError("Nooo, I don't want to die!!") 

但我想依賴於標準的管理形式,寧願以避免覆蓋每一個可能發生的缺失。

我的問題是:如何使預刪除信號拋出的驗證錯誤在管理表單中很好地呈現,或者如果失敗了,我怎樣才能讓模型清理方法在數據被刪除時檢測到?

Django的:1.6.1 的Python:3.3

+0

管理員的刪除由單獨的視圖處理,與模型視圖的形式無關。更糟的是,對於批量刪除,信號不會被觸發。所以你可能需要覆蓋管理員的刪除操作。 – Shuo 2014-10-10 16:07:21

+0

我測試了這個,發現上面列出的信號實際上是在批量刪除時觸發的,所以不確定你的意思。我也嘗試修改ModelAdmin.delete_model(),但是它產生的錯誤仍然是作爲500 /調試追蹤而不是一個好消息。如果你想用你的建議寫一個答案(並且它有效),我會很高興地接受它! – 2014-10-11 18:27:05

回答

0

這被證明是相當多的困難比它應該是,但我找到了解決方案通過重寫兩個ModelAdmin.delete_model(如果用戶訪問一個通過超鏈接的對象的單個實例)和delete_selected操作(如果用戶嘗試使用change_list刪除)並將邏輯放在那裏。