2009-08-13 4 views
52

क्या आपको पता है कि TEMPLATE_DEBUG ध्वज सेट होने पर django टेम्पलेट में जानना संभव है?एक django टेम्पलेट में TEMPLATE_DEBUG ध्वज को कैसे जांचें?

जब मैं अपनी विकास मशीन पर अपना django ऐप चला रहा हूं, तो मैं अपनी Google Analytics स्क्रिप्ट को अक्षम करना चाहता हूं। {% अगर डीबग%} टेम्पलेट टैग की तरह कुछ सही होगा। दुर्भाग्यवश, मुझे दस्तावेज में ऐसा कुछ नहीं मिला।

निश्चित रूप से, मैं इस ध्वज को संदर्भ में जोड़ सकता हूं लेकिन मैं जानना चाहता हूं कि ऐसा करने का एक बेहतर तरीका है या नहीं।

+2

नीचे उत्तर कम किया गया है। अब django के साथ आप इसे अधिक सरल बना सकते हैं: http://stackoverflow.com/questions/25783459/how-to-check-debug-true-false-in-django-template-exactly-in-layout-html/25783860# 25783860 – andi

उत्तर

61

मान लिया जाये कि आप settings.py में कुछ अन्य मूल्य के लिए TEMPLATE_CONTEXT_PROCESSORS सेट नहीं किया है, Django स्वचालित रूप से debug संदर्भ प्रीप्रोसेसर (के रूप में उल्लेख here) लोड होगा। इसका मतलब यह है कि आप एक चर अपने टेम्पलेट में debug बुलाया अगर settings.DEBUGऔर अपने स्थानीय मशीन का IP पता (जो केवल 127.0.0.1 हो सकता है) सच है के लिए उपयोग होगा (वर्णन किया गया है जो here) अलग-अलग settings.INTERNAL_IPS में सेट किया गया है । settings.INTERNAL_IPS आईपी पते की एक tuple या सूची है कि Django को "आंतरिक" के रूप में पहचानना चाहिए।

+2

ऐसा लगता है कि मेरी ज़रूरत के अनुरूप है लेकिन दुर्भाग्य से यह मेरे लिए काम नहीं करता है। मुझे नहीं पता कि क्या गलत है। – luc

+8

यह पूरी तरह से काम करता है जब तक मैं एक संदर्भ के बजाय RequestContext का उपयोग करता हूं। आपका बहुत बहुत धन्यवाद! – luc

+2

ओह, क्षमा करें! मैं यह उल्लेख करना भूल गया था कि आपको टेम्पलेट में 'RequestContext' पास करना होगा। – mipadi

0

आपको अपने context_processors पर ध्वज जोड़ने की आवश्यकता होगी।

यहां तक ​​कि एक वैकल्पिक तरीका भी नहीं हो सकता है। कम से कम, मुझे पता नहीं है कि कोई भी।

5

यदि आप पहले से नहीं हैं, तो यह हमेशा यह देखने में मदद करता है कि दूसरों ने डीजेंगोस्पिपेट्स पर एक ही मुद्दे का सामना किया है या नहीं। सबसे हाल ही में स्निपेट टैग के साथ काम कर रहे 1656 है: http://www.djangosnippets.org/snippets/1656/

क्या इस समाधान के बारे में अच्छा है कि यह अपने स्रोत के मामले में बाकी local_settings.py में अपने GOOGLE_ANALYTICS_CODE = xxxxxx रखने के लिए सार्वजनिक है आप की अनुमति देता है, अपने प्रमुख निजी रहता है । इसके अलावा यह लॉग इन उपयोगकर्ताओं के लिए एनालिटिक्स का उपयोग न करने के लिए एक अतिरिक्त कदम चला जाता है।

Google Analytics के लिए जावास्क्रिप्ट शामिल है। DEBUG चालू होने पर या कर्मचारियों के उपयोगकर्ताओं के लिए Google Analytics कोड नहीं दिखाएगा।

अपने टेम्पलेट्स में {% googleanalyticsjs %} का उपयोग करें।

आप की तरह

GOOGLE_ANALYTICS_CODE = "UA-1234567-1" 
अपनी सेटिंग्स फ़ाइल में

कुछ सेट करना होगा।

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

(यह मानते हुए django.core.context_processors.authTEMPLATE_CONTEXT_PROCESSORS में है, जो यह डिफ़ॉल्ट रूप से है)


from django import template 
import settings 
register = template.Library() 


class ShowGoogleAnalyticsJS(template.Node): 
    def render(self, context): 
     code = getattr(settings, "GOOGLE_ANALYTICS_CODE", False) 
     if not code: 
      return "<!-- Goggle Analytics not included because you haven't set the settings.GOOGLE_ANALYTICS_CODE variable! -->" 

     if 'user' in context and context['user'] and context['user'].is_staff: 
      return "<!-- Goggle Analytics not included because you are a staff user! -->" 

     if settings.DEBUG: 
      return "<!-- Goggle Analytics not included because you are in Debug mode! -->" 

     return """ 
     <script type="text/javascript"> 
      var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); 
      document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' 
      type='text/javascript'%3E%3C/script%3E")); 
     </script> 
     <script type="text/javascript"> 
      try { 
      var pageTracker = _gat._getTracker('""" + str(code) + """'); 
      pageTracker._trackPageview(); 
     } catch(err) {}</script> 
     """ 

def googleanalyticsjs(parser, token): 
    return ShowGoogleAnalyticsJS() 

show_common_data = register.tag(googleanalyticsjs) 
:

अपने टेम्पलेट चर में 'उपयोगकर्ता' मान लिया गया request.user है, जो यह करता है, तो आप का उपयोग किया जाएगा

+0

मेरे लिए, यह एकदम सही समाधान है .. –

49

यदि INTERNAL_IPS संशोधित करना संभव/उपयुक्त नहीं है, तो आप यह कर सकते हैं

myapp/context_processors.py में

:

settings.py में
from django.conf import settings 

def debug(context): 
    return {'DEBUG': settings.DEBUG} 

: एक संदर्भ प्रोसेसर th

TEMPLATE_CONTEXT_PROCESSORS = (
    ... 
    'myapp.context_processors.debug', 
) 
तब मेरे टेम्पलेट्स में

, बस:

{% if DEBUG %} .header { background:#f00; } {% endif %} 
+0

मुझे इसके लिए कोई दस्तावेज़ नहीं मिला, और ऐसा लगता है कि django 1.6 से पहले इसकी आवश्यकता नहीं थी .. मुझे यह थोड़ा पुराना लगता है, कोई स्पष्टीकरण? क्या मुझे संदर्भ में कोई विशिष्ट सेटिंग लोड करने की आवश्यकता है? यह बहुत ही व्यवस्थित नहीं है .. टिप के लिए धन्यवाद हालांकि –

14

Django 1.9settings.py:

INTERNAL_IPS = (
    '127.0.0.1', 
) 

टेम्पलेट:

{% if debug %} 

https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-INTERNAL_IPS का कहना है:

आईपी पतों की एक सूची, तारों के रूप में, कि:

  • को डिबग() संदर्भ प्रोसेसर की अनुमति दें टेम्पलेट संदर्भ में कुछ चर जोड़ें।

debug संदर्भ प्रोसेसर डिफ़ॉल्ट settings.py में है।

+0

क्या यह एक अच्छा समाधान है या एक हैकी समाधान है? –

+0

@ ÖzerS। पूरे Django तर्कसंगत हैक है! :-) (मुझे लगता है कि यह ठीक है लेकिन मैं 100% नहीं हूं) –

4

{% if debug %} चाल कर सकते हैं लेकिन केवल तभी यदि आप Context के बजाय RequestContext पास करते हैं। इसके अतिरिक्त, debug एक बुलियन ध्वज नहीं है, यह एक ऐसा कार्य है जब मूल्यांकन किया गया है जबकि DEBUG = True कुछ डीबगिंग जानकारी लौटाता है। यह आपके टेम्पलेट के लिए अनावश्यक ओवरहेड हो सकता है।

व्यक्तिगत रूप से, मैं इसके बजाय यह चाल करता हूं।

{% if request.META.HTTP_HOST == "127.0.0.1:8000" %} 

यह हमेशा काम करेंगे, लेकिन दोनों डीबग ध्वज और INTERNAL_IP पर भरोसा करने के बजाय, यह सिर्फ मुश्किल कोडित आईपी के लिए काम करते हैं।

+0

इसे DRY का उल्लंघन न करने के लिए 'take_context = True' के साथ टेम्पलेट टैग पर ले जाने के लिए बेहतर है। – arogachev

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