2010-02-11 14 views
59

मुझे एक अजीब समस्या है, मैं संदर्भ प्रोसेसर का उपयोग कर एक वैश्विक क्वेरी जोड़ना चाहता हूं। यह मैं इसे कैसे following द्वारा किया है:Django, टेम्पलेट संदर्भ प्रोसेसर

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',) 
:

from myproject.myapp.models import Foo 

def foos(request): 
    return {'foos': Foo.objects.all()} 

और मेरे setting.py के अंत में मैं इस जोड़ लिया है:

जैसे मेरे एप्लिकेशन में एक processor.py बनाया

def index_view(request): 

    return render_to_response('index.html', {}, context_instance=RequestContext(request)) 

और मेरे index.html टेम्पलेट पर:

अन्त में मैं इस रूप में मेरे विचार से पारित :

<select id="select_foo"> 
{% for foo in foos %} 
    <option value="/{{ foo.slug }}">{{ foo.name }}</option> 
{% endfor %} 
</select> 

और अंत में मेरा url: बिना किसी समस्या के

(r'^$', 'myapp.views.index_view'), 

मेरे कम महत्वपूर्ण चीज़ें प्रदर्शन, हालांकि मेरी MEDIA_URL और अन्य संदर्भों चले गए हैं। मुद्दा

उत्तर

53

जब आप यह निर्दिष्ट किया जा सकता है क्या:

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',) 

अपनी सेटिंग्स फ़ाइल में, आप Django के default context processors अधिभावी कर रहे हैं। करने के लिए सूची का विस्तार, आप अपनी सेटिंग में डिफ़ॉल्ट लोगों को शामिल करना होगा:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.i18n", 
    "django.core.context_processors.media", 
    "myapp.processor.foos", 
) 

ध्यान दें, सेटिंग ऊपर चूक (और अपना प्रोसेसर) Django 1.1 के लिए कर रहे हैं।

+0

मैं डिफ़ॉल्ट रूप से डिफ़ॉल्ट Django 1.1.1 और media_url का उपयोग कर ठीक से काम कर रहा था, मेरे सेटिंग्स में TEMPLATE_CONTEXT_PROCESSORS नहीं है। – Hellnar

+5

ऐसा इसलिए है क्योंकि यदि आप इसे निर्दिष्ट नहीं करते हैं, तो यह djangos सेटिंग्स में निर्दिष्ट डिफ़ॉल्ट मानों का उपयोग करता है। इस प्रकार सभी django सेटिंग्स काम करते हैं, उनके पास एक डिफ़ॉल्ट है जिसका उपयोग तब किया जाएगा यदि आपके पास यह 'सेटिंग.py' में नहीं है। –

+0

धन्यवाद अब काम कर रहा है! मुझे त्रुटि मिल रही थी इसलिए मैंने हटा दिया "django.contrib.messages.context_processors.messages", मुझे लगता है कि यह django के विकास संस्करण के लिए है, 1.1.1 – Hellnar

6

यहाँ Django 1,3

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.i18n", 
    "django.core.context_processors.media", 
    "django.core.context_processors.static", 
    "django.contrib.messages.context_processors.messages", 
    "myapp.processor.foos",) 
173

के लिए मेरे लिए काम किया आप TEMPLATE_CONTEXT_PROCESSORS के मूलभूत मूल्यों जोड़ने की जरूरत है। हालांकि, के बजाय हार्ड-कोड उन मूल्यों, Django के विशेष संस्करण में जोड़ दी जाएंगी जो, आप अपने संदर्भ प्रोसेसर डिफ़ॉल्ट मानों के लिए का पालन करके जोड़ सकते हैं:

from django.conf import global_settings 
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    "myapp.processor.foos", 
) 

में अनुगामी अल्पविराम शामिल करना सुनिश्चित करें tuple, ताकि पायथन इसे एक tuple के रूप में पहचानता है।

+2

के साथ पहली पंक्ति को प्रतिस्थापित करने की आवश्यकता है इस टिप के लिए धन्यवाद! यह टीएम के जवाब की तरह सुझाव देने वाले अधिक सामान्य समाधानों की तुलना में बहुत बेहतर है। डिफॉल्ट के पूरे सेट को निर्दिष्ट करने के लिए सिर्फ एक को जोड़ने के लिए मुझे हमेशा एक कड़वाहट के रूप में मारा, और यकीन है कि जब मैं django 1.3 में अपग्रेड किया गया तो यह मेरे पास वापस आ गया और चीजें काम नहीं कर रहीं क्योंकि मुझे डिफ़ॉल्ट स्थैतिक संदर्भ प्रोसेसर याद आ रहा था। –

+8

यह बेहतर उत्तर है, क्योंकि डिफ़ॉल्ट प्रोसेसर बदलते समय भी यह काम करेगा। – Canuck

+2

@ ग्रेग ग्लॉकनर यह एक महान टिप है, लेकिन मुझे वह कोड कहां जोड़ना चाहिए? 'Settings.py'? – dialex

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