2010-07-14 17 views

Trả lời

10

get_object_or_404() về cơ bản là một chức năng 5 dòng đơn giản. Trừ khi bạn có một lý do cụ thể để sử dụng nó, chỉ cần làm:

try: 
    instance = YourModel.objects.get(pk=something) 
except YourModel.DoesNotExist: 
    return render_to_response('a_template_with_your_error_message.html') 

Nếu vì bất cứ lý do bạn sử dụng get_object_or_404(), bạn có thể thử đặt nó trong một khối try: ... except Http404: ..., nhưng tôi thành thật không thể nghĩ về một lý do chính đáng cho điều đó.

0

Không thể thực hiện được với lối tắt đó. Nó chỉ có thể nâng cao một ngoại lệ Http404. Đặt cược tốt nhất của bạn là thử bắt nếu bạn muốn toàn quyền kiểm soát. Ví dụ.

try: 
    obj = Model.objects.get(pk = foo) 
except: 
    return HttpResponseRedirect('/no/foo/for/you') 
    #or 
    return render_to_response ... 
1

Và tại sao chính xác bạn không sử dụng khả năng của máy chủ để thực hiện điều đó?
get_object_or_404() đang chuyển hướng đến trang mặc định 404 phải không?
Nếu bạn đang ở chế độ gỡ lỗi, bạn sẽ không nhìn thấy nó nhưng khi triển khai django sẽ chỉ đề cập đến trang 404 của máy chủ.

1

Như đã nói bởi michael, khi sử dụng get_object_or_404 bạn không thể tùy chỉnh thông điệp được đưa ra trên http 404. Thông báo được cung cấp trong DEBUG cung cấp thông tin về ngoại lệ: "Không MyModel khớp với truy vấn đã cho."

Khám phá doc về điều này. Có ba đối số: Mô hình, * args và ** kwargs. Hai cái cuối cùng được sử dụng để xây dựng một đối số cho get() hoặc filter() trên Model. Tuy nhiên, lý do tôi viết là giải quyết câu hỏi tại sao chúng ta muốn sử dụng hàm trợ giúp như get_object_or_404() thay vì, ví dụ, bắt nó với một ngoại lệ như Model.DoesNotExist.

Giải pháp sau này kết hợp lớp chế độ xem với lớp mô hình. Trong một nỗ lực để thư giãn khớp nối này chúng ta có thể tận dụng lợi thế của các khớp nối kiểm soát được cung cấp trong các mô-đun django.shortcuts [1].

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