2009-10-25 30 views
13

Tôi có một dự án mà tôi đang làm việc trên django. Có rất nhiều trường hợp tôi: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?

raise Http404("this is an error") 

và tạo trang 404 đẹp cho tôi với thông báo lỗi "đây là lỗi" được viết trên đó.

Tôi bây giờ muốn tạo trang lỗi tùy chỉnh và vẫn hiển thị thông báo nhưng tôi không thể tìm ra cách.

Tôi chắc chắn đó chỉ là biến mẫu mà tôi cần thêm vào mẫu 404 tùy chỉnh của mình, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào cho nó.

+0

có bạn tìm ra cách để nhận "đây là một lỗi" tin nhắn vào tùy chỉnh Trình xử lý 404? @ Alasdair, nbv4 tôi sẽ thực sự apretiate giúp đỡ của bạn. – marianobianchi

+0

@marianobianchi Tôi đã nhầm lẫn nói rằng sẽ có thể sử dụng trình xử lý 404 tùy chỉnh để đạt được điều này, nhưng nó không thực sự khả thi. Đã có [yêu cầu kéo] (https://github.com/django/django/pull/1397) cho một thay đổi bắt buộc nhưng đã bị từ chối. Sau khi nghĩ về nó, tôi đồng ý với quyết định. Tôi nghĩ tốt hơn nên sử dụng khung thư như Euribates đề xuất hoặc hiển thị mẫu tùy chỉnh và trả lại trạng thái 404. Nếu bạn bao gồm thông báo ngoại lệ trong mẫu 404 mặc định, có nguy cơ bạn hiển thị thông báo lỗi không phù hợp cho người dùng cuối của mình. – Alasdair

Trả lời

8

Kể từ Django 1.9, ngoại lệ được chuyển đến chế độ xem page_not_found chạy khi bạn tăng Http404. Một đại diện của lỗi được chuyển cho template, bạn có thể đưa nó vào trong mẫu của bạn với:

{{ exception }} 

Trong các phiên bản trước đó, ngoại trừ không được thông qua để xem page_not_found, vì vậy đã có không phải là một cách dễ dàng để bao gồm thông báo từ ngoại lệ trong mẫu.

Một khả năng là sử dụng khung thư như @Euribates gợi ý trong câu trả lời của họ. Một cách khác là hiển thị mẫu và trả về mã trạng thái 404 trong chế độ xem của bạn, thay vì tăng Http404.

+0

Điều này đã thay đổi kể từ 1.9.6: bây giờ 'ngoại lệ' chứa thông báo: http://stackoverflow.com/a/37109914/895245 –

+0

' {{exception}} 'chỉ hiển thị bất kỳ tập hợp thông điệp tùy chỉnh nào trong khung nhìn nếu' DEBUG' được đặt thành 'True'. Nếu 'DEBUG = False', thì' {{exception}} 'được sử dụng trong 404.html chỉ đơn giản là hiển thị" Http404 ". –

6

Có một cách khác. Mã số tại page_not_found sử dụng RequestContext; điều đó có nghĩa là bạn có quyền truy cập vào tất cả các biến được xác định bởi tất cả các bộ xử lý ngữ cảnh được xác định trong mục nhập TEMPLATE_CONTEXT_PROCESSORS trong settings.py. Giá trị mặc định bao gồm, trong số những người khác, django tin nhắn khuôn khổ.

Vì vậy, bạn xác định thư bạn muốn hiển thị bằng cách sử dụng messages.error, ví dụ và hiển thị thông báo trong mẫu bằng biến số messages.

Nói cách khác, bạn có thể viết cái nhìn của bạn như thế này:

from django.contrib import messages 
from django.http import Http404 
from django.template import RequestContext 

def my_view(request): 
    # your code goes here 
    if something_horribly_wrong_happened(): 
     messages.error(request, 'Somethig horribly wrong happened!') 
     raise Http404("It doesn't mind whatever you put here") 
    else: 
     return render_to_response(
      'template.html', 
      RequestContext(request, locals()), 
      ) 

Trong mẫu 404.html của bạn, bạn nên viết một cái gì đó như:

{% if messages %} 
<ul class="messages"> 
    {% for message in messages %} 
    <li>{{ message }}</li> 
    {% endfor %} 
</ul> 
{% endif %} 

Đó là phức tạp hơn một chút, nhưng nó có lợi thế là bạn có thể gửi nhiều tin nhắn, và thậm chí sử dụng các loại tin nhắn khác nhau (Cảnh báo, Gỡ lỗi, Thông tin, Lỗi, vv ...) Bạn có thể đọc thêm về khung tin nhắn django tại đây: The messages framework | Django Documentation.

1

Tôi có giải pháp đơn giản hơn

Chỉ cần viết phần mềm trung gian, sẽ đưa văn bản lỗi của bạn vào một số biến yêu cầu. Xem ví dụ

from django.http.response import Http404 

class Error404Middleware(object): 
    def process_exception(self, request, exception): 
     if isinstance(exception, Http404): 
      request.error_404_message = exception.message 

Trong 404.html

{{ request.error_404_message }} 
Các vấn đề liên quan