2012-01-24 13 views
8

एक django टेम्पलेट में, {{ var }} पर कॉल चुपचाप विफल हो जाएगा यदि var अपरिभाषित है। इससे टेम्पलेट्स को डीबग करना मुश्किल हो जाता है। क्या कोई सेटिंग है जिसे मैं स्विच कर सकता हूं ताकि डीजेंगो इस मामले में अपवाद फेंक दे?django टेम्पलेट्स सख्त

मुझे ऑनलाइन मिले समाधान पर एकमात्र संकेत http://groups.google.com/group/google-appengine/browse_thread/thread/86a5b12ff868038d है और यह बहुत ही हैकी लगता है।

+0

आपके निर्दिष्ट लिंक में विधि 1 अच्छा दिखता है। चूंकि कस्टम टेम्पलेट टैग टेम्पलेट कार्यक्षमता को विस्तारित करने के लिए वैध विकल्प हैं। कि के रूप में चर के नाम का कुछ यादृच्छिक पाठ के बजाय परिभाषित नहीं है प्रिंट होगा –

उत्तर

4

Django < = अपने settings.py में 1,9

सेट TEMPLATE_STRING_IF_INVALID = 'DEBUG WARNING: undefined template variable [%s] not found'
https://docs.djangoproject.com/en/1.9/ref/settings/#template-string-if-invalid

Django> = 1,10

सेट string_if_invalid = 'DEBUG WARNING: undefined template variable [%s] not found' टेम्पलेट अपने settings.py में विकल्प:

डॉक्स देखें। https://docs.djangoproject.com/en/2.0/topics/templates/#module-django.template.backends.django

भी पढ़ें:: http://docs.djangoproject.com/en/dev/ref/templates/api/#invalid-template-variables

+1

'TEMPLATE_STRING_IF_INVALID = '% s'' अधिक उचित होगा। हालांकि दूसरे लिंक पर सलाह बॉक्स को बहुत ध्यान से पढ़ें। यह वास्तव में एक-ऑफ डिबगिंग उदाहरणों के लिए है, * नहीं * कुछ जो आपको विकास में हर समय छोड़ना चाहिए। –

+2

TEMPLATE_STRING_IF_INVALID सेटिंग्स अमान्य चर खोजने में मदद करेंगे, जब हम उन्हें टेम्पलेट में प्रिंट करने का प्रयास करेंगे, लेकिन यदि चर को if-statement में या फॉर-लूप में संग्रह के रूप में उपयोग किया जाता है, तो कोई मदद नहीं मिलती है। .. क्या इन मामलों को पकड़ने का कोई तरीका है? – Eldamir

+1

यदि कोई चर अपरिभाषित है तो अपवाद बढ़ाने का कोई तरीका है? – utapyngo

-1

डिजाइन का हिस्सा है कि

डॉक्स देखें। यह आपको संदर्भ में एक चर मौजूद है या नहीं, इस पर आधारित डिफ़ॉल्ट और स्विच प्रदान करने की अनुमति देता है। यह टेम्पलेट्स को बहुत लचीला होने की अनुमति देता है और सख्त "प्रत्येक दृश्य में अपना स्वयं का टेम्प्लेट होना चाहिए" दृष्टिकोण के बजाय टेम्पलेट्स की पुनः उपयोगिता को बढ़ावा देता है।

अधिकतर बिंदुओं पर, टेम्पलेट्स को वास्तव में "डीबग" नहीं माना जाता है। विचार विचार या मॉडल में टेम्पलेट बाहर संभव के रूप में अपने तर्क का जितना डाल करने के लिए, है। यदि आप यह जानना चाहते हैं कि संदर्भ में पारित होने वाला एक चर क्यों नहीं है, तो आपके विचार में डीबग करने की जगह है। अपने दृश्य रिटर्न से पहले कहीं और import pdb;pdb.set_trace() ड्रॉप करें।

+1

यह कोड है; इसे किसी बिंदु पर डीबगिंग की आवश्यकता होगी। – Marcin

+0

@ मार्सिन: मैं Django के परिप्रेक्ष्य की भावना में बोल रहा हूं। यदि आप टेम्पलेट-ड्रैगिंग से संबंधित चीजों के लिए टेम्पलेट डीबग त्रुटियों पर भरोसा कर रहे हैं, तो टेम्पलेट-छेड़छाड़ या अन्य सरल गलतियों से संबंधित नहीं, तो आपको अपने टेम्पलेट में बहुत अधिक तर्क मिल सकता है। –

+0

अच्छा, यह राय का विषय है :) लेकिन यह 'Django राय' है, और यदि यह आपके लिए महत्वपूर्ण है, तो एक अलग टेम्पलेट इंजन का उपयोग करें! मैं दूसरों के बीच इस कारण से करता हूं। – AdamKG

2

djangosnippets से यह हैक एक अपवाद उठाएगा जब टेम्पलेट में एक अपरिभाषित चर का सामना किया जाता है।

# settings.py 
class InvalidVarException(object): 
    def __mod__(self, missing): 
     try: 
      missing_str = unicode(missing) 
     except: 
      missing_str = 'Failed to create string representation' 
     raise Exception('Unknown template variable %r %s' % (missing, missing_str)) 
    def __contains__(self, search): 
     if search == '%s': 
      return True 
     return False 

TEMPLATE_DEBUG = True 
TEMPLATE_STRING_IF_INVALID = InvalidVarException() 
+0

यह 1.9% अगर foobar%} में '{%% foobar%} 'या' {% fooobar%} में foo के लिए अपरिभाषित foobar का पता लगाना प्रतीत नहीं होता है ' – azmeuk

+0

1.9.x> 1.10.1 से अपग्रेड के बाद मुझे मिलता है:'?: (टेम्पलेट्स। E002) टेम्पलेट्स में 'string_if_invalid' विकल्प एक स्ट्रिंग होना चाहिए लेकिन मिला: (InvalidVarException) पर। 'तो यह हैक अब और काम नहीं करता है। – allcaps

+0

@allcaps क्या होगा यदि आप इसे 'बेसस्ट्रिंग' या 'यूनिकोड' से प्राप्त करते हैं? – utapyngo

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