2012-07-02 22 views

Trả lời

99

Chỉ cần dùng thử và nắm bắt.

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}) 

Nếu bạn muốn bạn có thể sử dụng thông báo trong mẫu của mình.

EDIT

Cám ơn Jill-Jênn Vie, bạn nên sử dụng e.__cause__, as described here.

+0

Cảm ơn, tôi không thể hiểu tại sao "từ MySQLdb nhập IntegrityError" đã không thực hiện lừa. Các ngăn xếp cuộc gọi dường như cho thấy đó là thư viện nâng cao lỗi, nhưng nó bằng cách nào đó được chuyển đến django.db. Grr. – Julian

+1

Như đã chỉ ra trong [docs of v1.6] (https://docs.djangoproject.com/en/1.6/ref/exceptions/#database-exceptions), 'e .__ cause__' được ưu tiên, theo [PEP 3134] (http://legacy.python.org/dev/peps/pep-3134/). –

+0

Cảm ơn, tôi đã cập nhật câu trả lời. – Joe

3

giải pháp đơn giản nhất: viết một middleware thực hiện process_exception rằng chỉ bắt IntegrityError và trả về một HttpResponse với mẫu render của bạn, và chắc chắn rằng middleware này là sau khi báo lỗi mặc định xử lý trung gian vì vậy nó được gọi trước (cf https://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception để biết thêm).

Bây giờ nếu tôi là bạn, tôi sẽ không giả định một điều như "chỉ có một trường hợp rõ ràng mà" IntegrityError "có thể phát sinh", vì vậy tôi khuyên bạn nên đăng nhập ngoại lệ (và gửi cảnh báo email) phần mềm trung gian của bạn.

+0

Đặt nó trong phần mềm trung gian sẽ không chỉ bắt lỗi trong ứng dụng, mà còn trong tất cả các ứng dụng trong dự án. –

+0

@ChrisWesseling: Hoàn toàn đồng ý, đó là lý do tại sao tôi đề cập rằng "Tôi sẽ không cho rằng một điều như" chỉ có một trường hợp hiển nhiên mà "IntegrityError" có thể phát sinh "" –

+1

Súng không bắn người vào chân, mọi người bắn người ở dưới chân. :-) –

5

Nếu bạn đang sử dụng quan điểm dựa trên lớp với mixin createView, bạn sẽ muốn "thử" các cuộc gọi đến form_valid của lớp cha, ví dụ:

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!") 

Bạn có thể sử dụng mẫu, render_to_response vv để làm cho đầu ra đẹp hơn, tất nhiên.

1

Tôi sẽ xác thực nó bằng ModelForm. Ví dụ:

Bạn có mô hình:

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

Và 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 

Trong trường hợp này khi bạn gửi tên đó là duy nhất. Bạn sẽ nhận được lỗi xác nhận trước IntegrityError. Thông báo 'Danh mục đã tồn tại' sẽ được hiển thị trong biểu mẫu của bạn trong mẫu

Các vấn đề liên quan