2014-10-28 70 views
1

我正面臨一個奇怪的用例,我不知道如何繼續。在Django中,如何在Model.save()期間引發非驗證錯誤?

我重寫了save()方法DNSRecord Model。覆蓋的主要原因是添加額外的副作用,作爲保存的一部分必須在外部系統上完成的額外工作。附加的操作包括:

  1. 從ip地址模型表格Fecthing ip地址的空實例,

  2. 更新說ip地址,並

  3. 製作REST API的調用序列實際創建UltraDNS中的DNS記錄。

除了寫入DNSRecord,每個這三個副作用可以最終失敗,在該點處保存應中止(用於原子),並報告給用戶。

我的交易安全性降低了,但我不確定如何以合理的方式將錯誤報告給用戶。我讀過ValidationErrors不適合在這裏使用,有些消息來源表示,save()中的所有例外都不是raise,這似乎太嚴格了。我應該如何處理這些案例,以便我能夠提供反饋意見,以便爲錯誤發生的原因提供依據,同時還會失敗呢?

作爲單挑,我只使用管理界面。

+0

你不需要引發任何異常,你只需確保一切順利,如果不是,返回True或False,那麼在視圖中你可以檢查'form.save()'是如何去顯示一條消息給用戶告訴他表格是有效的,但保存出錯了...... – 2014-10-29 10:00:00

回答

1

我通常把這種檢查的原子塊,然後拋出異常,看看你是否可以從它那裏得到任何東西 -

在模型 -

def save(self, *args, **kwargs): 
    if self.pk is None: 
     .... 

    if self.date_created is None: 
     ..... 

    with transaction.atomic(): 
     self.clean() # my personal clean method 
     raise Exception("This is a dummy exception") #this will automatically roll back all the save methods call hierarchy if they are also following this process, to nothing is saved 
     super().save() 

在視圖類(基礎類視圖),以向用戶顯示錯誤消息 -

def post(self, request, *args, **kwargs): 

    if form.is_valid(): 
     ....... # create the model 
     try: 
      model.save() 
      return self.form_valid(form) 
     except Exception as err: 
      messages.error(request, str(err)) 
    return self.form_invalid(form) 

然後在模板它們顯示爲 -

<div class="flash_message hide"> 
         {% if messages %} 
         <ul class="messages"> 
          {% for message in messages %} 
          <li{% if message.tags %} class="alert alert-{{ message.tags }}"{% endif %}> 
          {{ message|safe }} 
          </li> 
          {% endfor %} 
         </ul> 
         {% endif %} 
        </div> 

注意:我使用Django Message Framework將消息從視圖傳遞到模板。我也使用twitter bootstrap 3,所以我的模板格式如此。

您還可以繼承Exception以添加自定義錯誤。