2012-07-02 9 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ため

EDIT

おかげで、あなたはe.__cause__as described hereを使用する必要があります。

+0

「MySQLdb import IntegrityErrorから」というのはなぜこのトリックを行っていないのか分かりませんでした。コールスタックは、ライブラリがエラーを起こしているように見えましたが、何とかdjango.dbに移動しました。 Grr。 – Julian

+1

[docs of 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

最も簡単な解決策:のみIntegrityErrorをキャッチし、あなたのレンダリングされたテンプレートでのHttpResponseを返すprocess_exceptionを実装するミドルウェアを書き、このミドルウェアは、それが(多くのためhttps://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exceptionをCF)の前に呼び出されるように、ミドルウェアのデフォルトのエラー処理の後であることを確認してください。

私があなただったら、「IntegrityErrorが発生する可能性があるのは明らかなケースが1つしかないので、例外をログに記録して電子メールアラートを送信することを強くお勧めします。あなたのミドルウェア。

+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の前に検証エラーが発生します。 'Category already exists'というメッセージがテンプレートにフォームに表示されます

関連する問題