2009-08-13 8 views
52

Czy wiesz, czy w szablonie django można się dowiedzieć, czy ustawiono flagę TEMPLATE_DEBUG?Jak sprawdzić flagę TEMPLATE_DEBUG w szablonie django?

Chciałbym wyłączyć mój skrypt google analytics, gdy uruchamiam moją aplikację django na mojej maszynie programistycznej. Coś jak tag szablonu {% if debug%} byłoby idealne. Niestety, nie znalazłem czegoś takiego w dokumentacji.

Na pewno mogę dodać tę flagę do kontekstu, ale chciałbym wiedzieć, czy jest lepszy sposób na zrobienie tego.

+2

Poniżej przedstawiona odpowiedź jest amortyzowana. Teraz dzięki django możesz znacznie łatwiej: http://stackoverflow.com/questions/25783459/how-to-check-debug-true-false-in-django-template-exactly-in-layout-html/25783860# 25783860 – andi

Odpowiedz

61

Zakładając, że nie ustawiono TEMPLATE_CONTEXT_PROCESSORS na inną wartość w settings.py, Django automatycznie załadować preprocesor debug kontekstowe (jak wspomniano here). Oznacza to, że będziesz mieć dostęp do zmiennej o nazwie debug w szablonach jeślisettings.DEBUG jest prawdą i lokalny adres IP urządzenia (które mogą być po prostu 127.0.0.1) jest ustawiony w zmiennej settings.INTERNAL_IPS (który jest opisany here) . settings.INTERNAL_IPS to krotka lub lista adresów IP, które Django powinien rozpoznać jako "wewnętrzny".

+2

Wydaje się odpowiadać mojej potrzebie, ale niestety to nie działa dla mnie. Nie mogę znaleźć tego, co jest nie tak. – luc

+8

To działa tak dobrze, jak długo używam RequestContext zamiast kontekstu. Wielkie dzięki! – luc

+2

Ups, przepraszam! Zapomniałem wspomnieć, że musisz przekazać szablon "RequestContext". – mipadi

0

Będziesz musiał dodać flagę DEBUG do swojego context_processors.

Może nie być nawet alternatywnego sposobu. Przynajmniej żaden nie znam.

5

Jeśli jeszcze tego nie zrobiłeś, zawsze pomaga sprawdzić, czy/jak inni poradzili sobie z tym samym problemem na odcinkach djang. Najnowszym fragment pracy z tagiem Analytics 1656: http://www.djangosnippets.org/snippets/1656/

Co jest ładne na temat tego rozwiązania jest to, że pozwala utrzymać GOOGLE_ANALYTICS_CODE = xxxxxx w local_settings.py w przypadku reszty źródła jest publiczny, klucz prywatny pozostaje . Dodatkowo stanowi dodatkowy krok do tego, aby nie używać analityki dla zalogowanych użytkowników.

Zawiera Javascript dla Google Analytics. Nie wyświetla kodu Google Analytics, gdy DEBUG jest włączony lub dla użytkowników personelu.

Użyj {% googleanalyticsjs %} w swoich szablonach.

Musisz ustawić coś takiego

GOOGLE_ANALYTICS_CODE = "UA-1234567-1" 

w pliku ustawień.

Zakłada 'użytkownik' w zmiennych szablonu jest request.user, co będzie, jeśli używasz:

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

(Zakładając django.core.context_processors.auth jest w TEMPLATE_CONTEXT_PROCESSORS, który jest domyślnie)


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) 
+0

Dla mnie jest to idealne rozwiązanie .. –

49

Jeśli modyfikowanie INTERNAL_IPS nie jest możliwe/odpowiednie, można to zrobić th procesor kontekstowego:

w myapp/context_processors.py:

from django.conf import settings 

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

w settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    ... 
    'myapp.context_processors.debug', 
) 

Następnie w moich szablonów, po prostu:

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

Nie znalazłem dla tego dokumentu, i nie było to potrzebne przed django 1.6. Uważam, że to trochę stare, jakieś wyjaśnienie? Czy muszę załadować jakieś konkretne ustawienie do kontekstu? To nie jest bardzo wygodne, myślę, że .. Dzięki za podpowiedź –

14

Django 1.9settings.py:

INTERNAL_IPS = (
    '127.0.0.1', 
) 

Szablony:

{% if debug %} 

https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-INTERNAL_IPS mówi:

lista adresów IP, jako ciągi, że:

  • Pozostawić debugowania() procesor kontekstowe do dodaj kilka zmiennych do kontekstu szablonu.

Procesor kontekst debug jest domyślnie settings.py.

+0

Czy to dobre rozwiązanie, czy raczej hacky rozwiązanie? –

+0

@ OzerS. całe Django to prawdopodobnie hack! :-) (myślę, że to w porządku, ale nie jestem w 100%) –

4

{% if debug %} może zrobić lewę, ale tylko wtedy, gdy przejdziesz RequestContext zamiast Context. Ponadto, debug nie jest znacznikiem boolowskim, jest to funkcja, która podczas obliczania podczas DEBUG = True zwraca niektóre informacje dotyczące debugowania. Może to być niepotrzebne obciążenie dla twojego szablonu.

Osobiście robię tę sztuczkę zamiast tego.

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

To zawsze działa, ale zamiast opierania się na obu flagi debugowania i INTERNAL_IP, to po prostu pracować dla zakodowanego OD.

+0

Lepiej przenieść go do tagu szablonu za pomocą 'takes_context = True', aby nie naruszać DRY. – arogachev

Powiązane problemy