2009-08-13 9 views
52

¿Sabes si es posible saber en una plantilla django si se establece el indicador TEMPLATE_DEBUG?¿Cómo verificar el indicador TEMPLATE_DEBUG en una plantilla django?

Me gustaría desactivar mi script de google analytics cuando estoy ejecutando mi aplicación django en mi máquina de desarrollo. Algo así como una etiqueta de plantilla {% if debug%} sería perfecto. Desafortunadamente, no encontré algo así en la documentación.

De seguro, puedo agregar esta bandera al contexto, pero me gustaría saber si hay una mejor manera de hacerlo.

+2

Debajo de la respuesta se deprecian. Ahora con django puedes hacerlo mucho más simple: http://stackoverflow.com/questions/25783459/how-to-check-debug-true-false-in-django-template-excaly-in-layout-html/25783860# 25783860 – andi

Respuesta

61

Suponiendo que no haya configurado TEMPLATE_CONTEXT_PROCESSORS a algún otro valor en settings.py, Django cargará automáticamente el preprocesador debug contexto (como se ha señalado here). Esto significa que usted tendrá acceso a una variable llamada debug en sus plantillas si settings.DEBUG es cierto y la dirección IP de la máquina local (que puede ser simplemente 127.0.0.1) se encuentra en la variable settings.INTERNAL_IPS (que se describe here) . settings.INTERNAL_IPS es una tupla o lista de direcciones IP que Django debe reconocer como "internas".

+2

Parece corresponder a mi necesidad, pero lamentablemente no funciona para mí. No puedo encontrar lo que está mal. – luc

+8

Eso funciona perfectamente siempre que use un RequestContext en lugar de un Context. ¡Muchas gracias! – luc

+2

Vaya, lo siento! Olvidé mencionar que debes pasar un 'RequestContext' a la plantilla. – mipadi

0

Deberá agregar la bandera DEBUG a su context_processors.

Puede que ni siquiera haya una manera alternativa. Al menos, ninguno que yo sepa.

5

Si aún no lo has hecho, siempre es útil ver si/cómo otros han tratado el mismo problema en djangosnippets. El fragmento más reciente trabajo con la etiqueta de análisis es 1656: http://www.djangosnippets.org/snippets/1656/

Lo bueno de esta solución es que le permite mantener su GOOGLE_ANALYTICS_CODE = xxxxxx en local_settings.py en el caso resto de su fuente es público, su clave privada permanece . Además, da un paso adicional para no usar análisis para los usuarios que han iniciado sesión.

Incluye el Javascript para Google Analytics. No mostrará el código de Google Analytics cuando DEBUG esté activado o para los usuarios del personal.

Use {% googleanalyticsjs %} en sus plantillas.

Debe establecer algo así como

GOOGLE_ANALYTICS_CODE = "UA-1234567-1" 

en su archivo de configuración.

Asume 'usuario' en sus variables de la plantilla es request.user, que lo será si se utiliza:

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

(Suponiendo django.core.context_processors.auth está en TEMPLATE_CONTEXT_PROCESSORS, que está por defecto)


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

Para mí, esta es la solución perfecta. –

49

Si no es posible modificar INTERNAL_IPS, puede hacer esto con th un procesador de contexto:

en myapp/context_processors.py:

from django.conf import settings 

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

en settings.py:

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

Luego, en mis plantillas, simplemente:

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

No encontré ningún documento para esto, y no parecía ser necesario antes de django 1.6 .. Encuentro esto un poco viejo, ¿alguna explicación? ¿Debo cargar alguna configuración específica al contexto? Esto no es muy conveniente, creo ... Gracias por la sugerencia, aunque –

14

Django 1.9settings.py:

INTERNAL_IPS = (
    '127.0.0.1', 
) 

Plantillas:

{% if debug %} 

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

una lista de direcciones IP, como cadenas, que:

  • Permitir el procesador contexto de depuración() para agregue algunas variables al contexto de la plantilla.

El procesador contexto debug está en el valor predeterminado settings.py.

+0

¿Es esta una buena solución o más bien una solución hacky? –

+0

@ ÖzerS. ¡todo el Django es posiblemente un truco! :-) (creo que está bien pero no estoy al 100%) –

4

{% if debug %} puede hacer el truco, pero solo si pasa RequestContext en lugar de Context. Además, debug no es un indicador booleano, es una función que cuando se evalúa mientras DEBUG = True devuelve información de depuración. Esto puede ser una sobrecarga innecesaria para su plantilla.

Personalmente, hago este truco.

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

Esto siempre funciona, pero en lugar de depender tanto indicador de depuración y INTERNAL_IP, sólo trabajar para el IP codificado.

+0

Mejor moverlo a la etiqueta de la plantilla con 'takes_context = True' para no violar DRY. – arogachev

Cuestiones relacionadas