2012-07-02 30 views

回答

99

只要使用try和catch。

from django.db import IntegrityError 
from django.shortcuts import render_to_response 

try: 
    # code that produces error 
except IntegrityError as e: 
    return render_to_response("template.html", {"message": e.message}) 

如果你希望你可以使用你的模板中的消息。

編輯

感謝Jill-Jênn Vie,你應該使用e.__cause__as described here

+0

謝謝,我不明白爲什麼「從MySQLdb導入IntegrityError」沒有做到這一點。調用堆棧似乎表明這是圖書館提出的錯誤,但它不知何故被轉移到django.db。格兒。 – Julian

+1

正如[文檔v1.6](https://docs.djangoproject.com/en/1.6/ref/exceptions/#database-exceptions)中所指出的那樣,「e____ cause__」是首選,按照[PEP 3134](http://legacy.python.org/dev/peps/pep-3134/)。 –

+0

謝謝,我已經更新了答案。 – Joe

3

簡單的解決方案:編寫實施process_exception,只有抓住IntegrityError,並與您呈現模板返回HttpResponse中間件,並確保該中間件是默認的錯誤處理中間件所以它之前(CF https://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception更多)被稱爲後。

現在,如果我是你,我不會假設「只有一個明顯的情況,」IntegrityError「可能出現」,所以我強烈建議你在日誌中記錄異常(併發送電子郵件警報)你的中間件。

+0

將它放入中間件不僅會捕獲應用程序中的錯誤,而且會捕獲項目中的所有應用程序。 –

+0

@ChrisWesseling:完全同意,這就是爲什麼我提到「我不會承擔這樣的事情」,只有一個明顯的情況,「IntegrityError」可能出現「」 –

+1

槍支不會在人腳下射擊,人們射擊腳下的人。 :-) –

5

如果您使用與CreateView的混入基於類的意見,你會想「試試」的號召,超類的form_valid,例如:

from django.db import IntegrityError 
... 
class KumquatCreateView(CreateView): 
    model = Kumquat 
    form_class = forms.KumquatForm 
    ... 
    def form_valid(self, form): 
     ... 
     try: 
      return super(KumquatCreateView, self).form_valid(form) 
     except IntegrityError: 
      return HttpResponse("ERROR: Kumquat already exists!") 

您可以使用模板,render_to_response等等,以使輸出更好,當然。

1

我會用ModelForm來驗證它。例如:

你有型號:

class Manufacturer(models.Model): 
    name = models.CharField(default='', max_length=40, unique=True) 

而且的ModelForm:

class ManufacturerForm(forms.ModelForm): 

    def clean(self): 
     cleaned_data = super(ManufacturerForm, self).clean() 
     name = cleaned_data.get('name') 
     if Manufacturer.objects.filter(name=name).exists(): 
      raise forms.ValidationError('Category already exists') 

    class Meta: 
     model = Manufacturer 

在當您提交的名稱是唯一此情況。在IntegrityError之前您會收到驗證錯誤。 「類別已存在」消息將顯示在您的表單中的模板

相關問題