69 votes

Comment vérifier le drapeau TEMPLATE_DEBUG dans un modèle django ?

Savez-vous s'il est possible de savoir dans un modèle django si l'indicateur TEMPLATE_DEBUG est activé ?

Je voudrais désactiver mon script de google analytics lorsque je lance mon application django sur ma machine de développement. Quelque chose comme une balise de modèle {% if debug %} serait parfait. Malheureusement, je n'ai pas trouvé quelque chose comme ça dans la documentation.

Je peux bien sûr ajouter cet indicateur au contexte, mais j'aimerais savoir s'il existe un meilleur moyen de le faire.

2 votes

Les réponses ci-dessous sont dépréciées. Maintenant avec django vous pouvez le faire beaucoup plus simple : stackoverflow.com/questions/25783459/

77voto

mipadi Points 135410

En supposant que vous n'avez pas défini TEMPLATE_CONTEXT_PROCESSORS à une autre valeur dans settings.py Django chargera automatiquement le fichier debug le préprocesseur de contexte (comme indiqué ici ). Cela signifie que vous aurez accès à une variable appelée debug dans vos modèles si settings.DEBUG est vrai et l'adresse IP de votre machine locale (qui peut être simplement 127.0.0.1) est définie dans la variable settings.INTERNAL_IPS (qui est décrit ici ). settings.INTERNAL_IPS est un tuple ou une liste d'adresses IP que Django doit reconnaître comme "internes".

2 votes

Il semble correspondre à mon besoin mais malheureusement il ne fonctionne pas pour moi. Je n'arrive pas à trouver ce qui ne va pas.

8 votes

Cela fonctionne parfaitement tant que j'utilise un RequestContext plutôt qu'un Context. Merci beaucoup !

2 votes

Oups, désolé ! J'ai oublié de mentionner que vous devez passer une RequestContext au modèle.

56voto

Tom Medley Points 9722

Si vous modifiez INTERNAL_IPS n'est pas possible/convenable, vous pouvez le faire avec un processeur contextuel :

sur myapp/context_processors.py :

from django.conf import settings

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

sur settings.py :

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

Puis dans mes modèles, tout simplement :

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

0 votes

Je n'ai pas trouvé de documentation à ce sujet, et cela ne semblait pas nécessaire avant la version 1.6 de Django. Je trouve cela un peu vieux, une explication ? Dois-je charger un paramètre spécifique dans le contexte ? Ce n'est pas très pratique je pense Merci pour l'astuce

29voto

Ciro Santilli Points 3341

Django 1.9+.

settings.py :

INTERNAL_IPS = (
    '127.0.0.1',
)

Modèles :

{% if debug %}

https://docs.djangoproject.com/en/dev/ref/settings/#internal-ips dit :

Une liste d'adresses IP, sous forme de chaînes de caractères, qui :

  • Permet au processeur de contexte debug() d'ajouter certaines variables au contexte du modèle.

Le site debug Le processeur contextuel est dans le mode par défaut settings.py .

5voto

rizumu Points 839

Si vous ne l'avez pas encore fait, il est toujours utile de voir si/comment d'autres personnes ont traité le même problème sur djangosnippets. Le snippet le plus récent qui fonctionne avec le tag analytique est le 1656 : http://www.djangosnippets.org/snippets/1656/

Ce qui est bien avec cette solution, c'est qu'elle vous permet de garder votre GOOGLE_ANALYTICS_CODE = xxxxxx dans local_settings.py dans le cas où le reste de votre source est public, votre clé reste privée. En outre, il va une étape supplémentaire pour ne pas utiliser l'analyse pour les utilisateurs connectés.

Inclut le Javascript pour Google Analytics. Ne montrera pas le code de Google Analytics lorsque DEBUG est activé ou aux utilisateurs du personnel.

Utilisez {% googleanalyticsjs %} dans vos modèles.

Vous devez définir quelque chose comme

GOOGLE_ANALYTICS_CODE = "UA-1234567-1"

dans votre fichier de paramètres.

Suppose que 'user' dans les variables de votre modèle est request.user ce qui sera le cas si vous utilisez :

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

(En supposant que django.core.context_processors.auth est en TEMPLATE_CONTEXT_PROCESSORS (ce qu'il est par défaut)


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)

5voto

Ramast Points 96

{% if debug %} peut faire l'affaire mais seulement si vous passez RequestContext au lieu de Context . En outre, debug n'est pas un indicateur booléen, c'est une fonction qui, lorsqu'elle est évaluée alors que DEBUG = True renvoie des informations de débogage. Cela peut représenter une surcharge inutile pour votre modèle.

Personnellement, je fais plutôt cette astuce.

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

Cela fonctionnera toujours, mais au lieu de s'appuyer à la fois sur l'indicateur DEBUG et sur INTERNAL_IP, cela fonctionne uniquement pour l'IP codée en dur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X