2011-07-11 7 views
5

मैं निम्नलिखित Django टेम्पलेट संदर्भ प्रोसेसर समस्या में चला गया है।यह Django टेम्पलेट संदर्भ प्रोसेसर सभी अनुरोधों के लिए क्यों लागू नहीं है?

संदर्भ प्रोसेसर myapp/context_processors.py में परिभाषित किया गया है:

def my_context_processor(request): 
    return { 
     'foo': 123, 
    } 

यह मानक Django संदर्भ प्रोसेसर के साथ settings.py में वायर्ड है:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth', 
    'django.core.context_processors.debug', 
    'django.core.context_processors.i18n', 
    'django.core.context_processors.media', 
    'myproject.myapp.context_processors.my_context_processor', 
) 

समस्या मैं का सामना कर रहा है कि है my_context_processor सभी अनुरोधों के लिए लागू नहीं है।

यह निम्न कोड के लिए लागू नहीं किया जाता है:

def index(request): 
    return render_to_response("index.html", locals()) 

हालांकि, यह निम्न कोड के लिए लागू किया जाता है:

def index(request): 
    return render_to_response("index.html", locals(), context_instance=RequestContext(request)) 

मैं धारणा है कि संदर्भ प्रोसेसर हैं के तहत किया गया सभी अनुरोधों के लिए आवेदन किया गया, न कि केवल context_instance प्रदान किया गया है।

मैं अपने अनुरोध प्रोसेसर को सभी अनुरोधों के लिए कैसे लागू कर सकता हूं?

उत्तर

11

आपने अपने स्वयं के प्रश्न का उत्तर दिया है। यह उन प्रतिक्रियाओं पर लागू होता है जो RequestContext का उपयोग करते हैं। यह उन लोगों पर लागू नहीं है जो नहीं करते हैं।

सभी प्रतिक्रियाओं पर इसे लागू करने का तरीका यह सुनिश्चित करना है कि आप हमेशा RequestContext का उपयोग करें। या, Django 1.3+ में, आप शॉर्टकट का उपयोग render_to_response के बजाय कर सकते हैं, जो आपके लिए RequestContext बनाता है।

0

संदर्भ प्रोसेसर वेरिएबल केवल RequestContext ऑब्जेक्ट (वर्तमान अनुरोध के साथ प्रारंभ) को context_instance के रूप में टेम्पलेट पर भेजते समय उपलब्ध हैं।

+1

क्या कोई DRY शॉर्टकट है जिसका उपयोग मैं context_instance बॉयलरप्लेट से बचने के लिए कर सकता हूं? मुझे लगता है कि एक आम बात यह है कि आप सभी अनुरोधों के लिए संदर्भ प्रोसेसर चर मौजूद होना चाहते हैं। कहें कि सभी विचारों में एक पाद लेख शामिल है जिसमें "linked_sites" सूची की आवश्यकता है। "linked_sites" को संदर्भ प्रोसेसर द्वारा प्रदान किया जाएगा, लेकिन मैं context_instance = RequestContext (अनुरोध) के साथ अपने कोड को छिड़कने से बचाना चाहता हूं :-) – knorv

3

Django Django 1.3 में एक नया render शॉर्टकट जो स्वचालित रूप से RequestContext

from django.shortcuts import render 

def my_view(request): 
    # View code here... 
    context = { 
     'some_extra_var_for_template': 'value' 
    } 
    return render(request, 'myapp/index.html', context) 

आप Django docs में इसके बारे में पढ़ सकते हैं शामिल की शुरुआत की।

संबंधित मुद्दे