2009-10-25 15 views
13

मेरे पास एक प्रोजेक्ट है जिसे मैं django में काम कर रहा हूं।Django में कस्टम 404 त्रुटि टेम्पलेट में Http404 को भेजे गए संदेश को कैसे प्रदर्शित करें?

raise Http404("this is an error") 

और यह त्रुटि संदेश उस पर लिखा "यह एक त्रुटि है" के साथ मेरे लिए एक अच्छा 404 पृष्ठ बनाता है: कई ऐसे उदाहरण हैं, जहां मैं का एक बहुत कुछ कर रहे हैं।

अब मैं एक कस्टम त्रुटि पृष्ठ बनाना चाहता हूं और इसे अभी भी संदेश प्रदर्शित करना चाहता हूं, लेकिन मैं यह नहीं समझ सकता कि कैसे।

मुझे यकीन है कि यह सिर्फ एक टेम्पलेट चर है कि मुझे अपने कस्टम 404 टेम्पलेट में जोड़ने की ज़रूरत है, लेकिन मुझे इसके लिए कोई दस्तावेज नहीं मिल रहा है।

+0

आप कस्टम में हो रही संदेश "यह एक त्रुटि है" का रास्ता खोजने के लिए है 404 हैंडलर? @Alasdair, nbv4 मैं वास्तव में आपकी मदद को बढ़ा दूंगा। – marianobianchi

+0

@ marianobianchi मैंने गलती से कहा कि इसे स्वीकार करने के लिए एक कस्टम 404 हैंडलर का उपयोग करना संभव होगा, लेकिन यह वास्तव में संभव नहीं है। एक आवश्यक परिवर्तन के लिए एक [पुल अनुरोध] (https://github.com/django/django/pull/1397) था, लेकिन इसे बंद कर दिया गया था। इसके बारे में सोचने के बाद, मैं निर्णय से सहमत हूं। मुझे लगता है कि यूरिबेट्स के सुझावों के अनुसार संदेश ढांचे का उपयोग करना बेहतर है, या कस्टम टेम्पलेट प्रस्तुत करना और स्थिति 404 लौटाएं। यदि आप डिफ़ॉल्ट 404 टेम्पलेट में अपवाद संदेश शामिल करते हैं, तो जोखिम है कि आप अपने अंतिम उपयोगकर्ताओं को अनुपयुक्त त्रुटि संदेश दिखाते हैं। – Alasdair

उत्तर

8

Django 1.9 के रूप में, अपवाद page_not_found पर भेजा गया है जो दृश्य Http404 उठाते समय चलाता है। त्रुटि की अभिव्यक्ति टेम्पलेट में पारित हो जाता है, तो आप इसके साथ अपने खाके में शामिल कर सकते हैं:

{{ exception }} 

पहले के संस्करणों में, अपवाद page_not_found देखने के लिए पारित नहीं किया गया था, तो वहाँ एक आसान तरीका नहीं था टेम्पलेट में अपवाद से संदेश शामिल करें।

एक संभावना है कि संदेश फ्रेमवर्क का उपयोग @Euribates उनके उत्तर में सुझाव देता है। एक और टेम्पलेट प्रस्तुत करना था और Http404 बढ़ाने के बजाय, अपने दृश्य में 404 स्टेटस कोड वापस करना था।

+0

यह 1.9.6 के रूप में बदल गया है: अब 'अपवाद' में संदेश है: http://stackoverflow.com/a/37109914/895245 –

+0

' {{upgrade}} 'केवल 'DEBUG' को' True' पर सेट किया गया है, तो दृश्य में सेट कोई कस्टम संदेश प्रस्तुत करता है। यदि 'DEBUG = गलत 'है, तो 404.html में उपयोग किया गया' {{upgrade}}' बस "Http404" प्रस्तुत करता है। –

6

एक और तरीका है। page_not_found पर कोड RequestContext का उपयोग करता है; इसका अर्थ है कि settings.py में TEMPLATE_CONTEXT_PROCESSORS प्रविष्टि में परिभाषित सभी संदर्भ प्रोसेसर द्वारा परिभाषित सभी चरों तक पहुंच है। डिफ़ॉल्ट मान में, दूसरों के बीच, django संदेश ढांचे शामिल हैं।

तो, आप संदेश को परिभाषित करना चाहते हैं जिसे आप messages.error का उपयोग करके दिखाना चाहते हैं, उदाहरण के लिए, और messages चर का उपयोग करके टेम्पलेट में संदेश दिखाएं।

दूसरे शब्दों में, अगर आप इस तरह आपके विचार लिख सकते हैं:

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()), 
      ) 

अपने 404.html टेम्पलेट में, आप की तरह कुछ लिखना चाहिए:

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

यह एक थोड़ा और अधिक जटिल है, लेकिन इसका लाभ यह है कि आप कई संदेश भेज सकते हैं, और यहां तक ​​कि अलग-अलग प्रकार के संदेशों का उपयोग भी कर सकते हैं (चेतावनी, डीबग, जानकारी, त्रुटि इत्यादि ...) आप यहां django संदेश ढांचे के बारे में अधिक पढ़ सकते हैं: The messages framework | Django Documentation

1

मैं सरल समाधान है

बस मिडलवेयर लिखते हैं, कि कुछ अनुरोध चर में अपने त्रुटि पाठ ले जाएगा। उदाहरण देखें

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 

404.html

{{ request.error_404_message }} 
संबंधित मुद्दे