How to check the TEMPLATE_DEBUG flag in a django template?

PythonDjangoTemplates

Python Problem Overview


Do you know if it is possible to know in a django template if the TEMPLATE_DEBUG flag is set?

I would like to disable my google analytics script when I am running my django app on my development machine. Something like a {% if debug %} template tag would be perfect. Unfortunately, I didn't find something like that in the documentation.

For sure, I can add this flag to the context but I would like to know if there is a better way to do that.

Python Solutions


Solution 1 - Python

Assuming you haven't set TEMPLATE_CONTEXT_PROCESSORS to some other value in settings.py, Django will automatically load the debug context preprocessor (as noted here). This means that you will have access to a variable called debug in your templates if settings.DEBUG is true and your local machine's IP address (which can simply be 127.0.0.1) is set in the variable settings.INTERNAL_IPS (which is described here). settings.INTERNAL_IPS is a tuple or list of IP addresses that Django should recognize as "internal".

Solution 2 - Python

If modifying INTERNAL_IPS is not possible/suitable, you can do this with a context processor:

in myapp/context_processors.py:

from django.conf import settings

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

in settings.py:

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

Then in my templates, simply:

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

Solution 3 - Python

Django 1.9+

settings.py:

INTERNAL_IPS = (
    '127.0.0.1',
)

Templates:

{% if debug %}

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

> A list of IP addresses, as strings, that: > > - Allow the debug() context processor to add some variables to the template context.

The debug context processor is in the default settings.py.

Solution 4 - Python

If you haven't already, it always helps to see if/how others have dealt with same issue on djangosnippets. The most recent snippet working with analytics tag is 1656: http://www.djangosnippets.org/snippets/1656/

What is nice about this solution is that it allows you to keep your GOOGLE_ANALYTICS_CODE = xxxxxx in local_settings.py in the case rest of your source is public, your key remains private. In addition it goes an extra step to not use analytics for logged in users.

> Includes the Javascript for Google Analytics. Will not show Google Analytics code when DEBUG is on or to staff users. > > Use {% googleanalyticsjs %} in your templates. > > You must set something like > > GOOGLE_ANALYTICS_CODE = "UA-1234567-1" > > in your settings file. > > Assumes 'user' in your template variables is request.user, which it will be if you use: > > return render_to_response('template.html',{ }, context_instance=RequestContext(request)) > > (Assuming django.core.context_processors.auth is in TEMPLATE_CONTEXT_PROCESSORS, which it is by default) > > --- > > 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 "" >
> if 'user' in context and context['user'] and context['user'].is_staff: > return "" >
> if settings.DEBUG: > return "" >
> return """ > > > """ >
> def googleanalyticsjs(parser, token): > return ShowGoogleAnalyticsJS() >
> show_common_data = register.tag(googleanalyticsjs)

Solution 5 - Python

{% if debug %} can do the trick but only if you pass RequestContext instead of Context. Additionally, debug is not a boolean flag, its a function that when evaluated while DEBUG = True return some debugging information. This can be unnecessary overhead for your template.

Personally, I do this trick instead.

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

This will always work but instead of relying on both DEBUG flag and INTERNAL_IP, it just work for the hard coded IP.

Solution 6 - Python

You will need to add the DEBUG flag to your context_processors.

There may not even be an alternative way. At least, none that I know of.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionlucView Question on Stackoverflow
Solution 1 - PythonmipadiView Answer on Stackoverflow
Solution 2 - PythonfredleyView Answer on Stackoverflow
Solution 3 - PythonCiro Santilli Путлер Капут 六四事View Answer on Stackoverflow
Solution 4 - PythonThomas SchreiberView Answer on Stackoverflow
Solution 5 - PythonRamastView Answer on Stackoverflow
Solution 6 - PythonlprsdView Answer on Stackoverflow