Trong ứng dụng được hỗ trợ django của tôi, chỉ có một trường hợp rõ ràng là "IntegrityError" có thể phát sinh.
Vì vậy, làm thế nào tôi có thể bắt lỗi đó và hiển thị thông báo bằng cách sử dụng mẫu?Django: Bắt lỗi toàn vẹn và hiển thị thông báo tùy chỉnh bằng cách sử dụng mẫu
Trả lời
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.
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.
Đặ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. –
@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 "" –
Súng không bắn người vào chân, mọi người bắn người ở dưới chân. :-) –
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.
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
- 1. Xác thực jQuery - Ẩn thông báo lỗi xác thực hiển thị/hiển thị lỗi tùy chỉnh
- 2. Quản trị viên Django, thông báo lỗi tùy chỉnh?
- 3. Thông báo lỗi tùy chỉnh bằng cách sử dụng Xác thực Mẫu CodeIgniter
- 4. Làm thế nào để hiển thị thông báo được truyền tới Http404 trong mẫu Lỗi 404 tùy chỉnh ở Django?
- 5. thông báo lỗi tùy chỉnh với Mẫu biểu mẫu
- 6. thông báo lỗi javac không hiển thị toàn bộ filepath
- 7. Symfony2 tùy chỉnh thông báo lỗi biểu mẫu
- 8. Thông báo Android- Hiển thị toàn bộ thông báo
- 9. Làm thế nào để hiển thị thông báo lỗi tùy chỉnh trong ScalaTest?
- 10. Thông báo lỗi đăng nhập tùy chỉnh JBoss JAAS Thông báo lỗi
- 11. Sự cố với mẫu thông báo tùy chỉnh loại bỏ thông báo
- 12. Sử dụng Biểu mẫu Django để hiển thị và chỉnh sửa?
- 13. Bình Python và thông báo lỗi khách hàng tùy chỉnh
- 14. Cách thêm thông báo lỗi vào form.non_field_errors bằng django?
- 15. cách tạo thông báo đẩy tùy chỉnh bằng cách sử dụng dịch vụ web asp.net?
- 16. Facebook như thông báo cập nhật bằng cách sử dụng tín hiệu django hoặc thông báo
- 17. Làm cách nào để hiển thị Thông báo lỗi bằng cách sử dụng Tác vụ tùy chỉnh được quản lý với Trình cài đặt Windows
- 18. Hiển thị Thông báo Lỗi với Sinatra
- 19. thông báo lỗi xác thực biểu mẫu mã thông báo không hiển thị
- 20. Báo cáo lỗi toàn diện và tùy chỉnh từ các ứng dụng Android
- 21. Node.js không hiển thị toàn bộ thông báo lỗi trên uncaughtException, có thể không?
- 22. Django: tùy chỉnh thông báo sau khi một biểu mẫu thành công lưu
- 23. Xác nhận Knockout - Cách hiển thị thông báo lỗi
- 24. Cách hiển thị thông báo lỗi xác thực biểu mẫu Ruby on Rails cùng một lúc
- 25. Lỗi Django 404 tùy chỉnh
- 26. Làm cách nào để hiển thị thông báo từ `thông báo django`?
- 27. Thêm Xác thực Mẫu Django Tùy chỉnh
- 28. Plugin xác nhận Knockout Thông báo lỗi tùy chỉnh
- 29. Tạo trường biểu mẫu Django tùy chỉnh sử dụng hai số <input> s
- 30. Cách tùy chỉnh thông báo lỗi xác thực JSF
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
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/). –
Cảm ơn, tôi đã cập nhật câu trả lời. – Joe