django-debug-toolbar: 'Template' object has no attribute 'engine'
Question: I've just tried running an existing Django project on a new computer, and I'm
having trouble with django-debug-toolbar. It seems to be something to do with
Jinja2. Here's the stack trace:

    
    
    Traceback:
    File "/path/to/myrepo/env/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
      223.                 response = middleware_method(request, response)
    File "/path/to/myrepo/env/local/lib/python2.7/site-packages/debug_toolbar/middleware.py" in process_response
      120.                 panel.generate_stats(request, response)
    File "/path/to/myrepo/env/local/lib/python2.7/site-packages/debug_toolbar/panels/templates/panel.py" in generate_stats
      175.             context_processors = self.templates[0]['context_processors']
    Exception Type: AttributeError at /first/page/
    Exception Value: 'Template' object has no attribute 'engine'
    

I'm using django-jinja2 to integrate Jinja2 into my project, and this worked
okay before but it now seems to be expecting this `template` variable to be a
normal Django template. In my `TEMPLATES` setting I have both Jinja2 and
DjangoTemplates set up, with Jinja2 using a specific extension ('tmpl') to
make sure only those templates are used by Jinja2 and everything else can go
through the DjangoTemplates backend.

Has anyone seen this error before when using django debug toolbar with Jinja2?
I can post more settings if needed.

EDIT: As requested, here's my TEMPLATES settings:

    
    
    TEMPLATES = [
        {
            #'BACKEND': 'django.template.backends.jinja2.Jinja2',
            'BACKEND': 'django_jinja.backend.Jinja2',
            #'NAME': 'jinja2',
            'DIRS': [
                os.path.join(DEPLOY_PATH, 'templates')
            ],
            'APP_DIRS': True,
            'OPTIONS': {
                'debug': DEBUG,
                'match_extension': '.tmpl',
                #'environment': 'jinja2.Environment',
                'extensions': [
                    'jinja2.ext.with_',
                    'jinja2.ext.i18n',
                    'django_jinja.builtins.extensions.UrlsExtension',
                    'django_jinja.builtins.extensions.CsrfExtension',
                    'pipeline.templatetags.ext.PipelineExtension',
                ],
                'context_processors': [
                    "django.contrib.auth.context_processors.auth",
                    "django.core.context_processors.debug",
                    "django.core.context_processors.i18n",
                    "django.core.context_processors.media",
                    "django.core.context_processors.static",
                    "django.contrib.messages.context_processors.messages",
                    "django.core.context_processors.request",
                ]
    
            },
        },
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [
                os.path.join(DEPLOY_PATH, 'templates')
            ],
            'APP_DIRS': True,
            'OPTIONS': {
                'debug': DEBUG,
                'context_processors': [
                    "django.contrib.auth.context_processors.auth",
                    "django.core.context_processors.debug",
                    "django.core.context_processors.i18n",
                    "django.core.context_processors.media",
                    "django.core.context_processors.static",
                    "django.contrib.messages.context_processors.messages",
                    "django.core.context_processors.request",
                ]
            }
        }
    ]
    

**Update** \- I've "fixed" the issue by making a small code change in the
debug toolbar source: changing line 175 in
`debug_toolbar/panels/templates/panel.py` from:

    
    
    template_dirs = self.templates[0]['template'].engine.dirs
    

to:

    
    
    if hasattr(self.templates[0]['template'], 'engine'):
        template_dirs = self.templates[0]['template'].engine.dirs
    elif hasattr(self.templates[0]['template'], 'backend'):
        template_dirs = self.templates[0]['template'].backend.dirs
    else:
        raise RuntimeError("Couldn't find engine or backend for a template: {}",format(self.templates[0]['template']))
    

I haven't looked into why this works (for some people this combination of
debug toolbar 1.5 and django-jinja 2.2.0 works fine) but I noticed that Jinja2
templates have the `backend` attribute and the Django templates have the
`engine` attribute, and both appear to be used for the same thing.


Answer: I get this too, you can hack it fixed based on your suggestion without hacking
core by supplying your own panel class:

**debug.py**

    
    
    from debug_toolbar.panels.templates import TemplatesPanel as BaseTemplatesPanel
    
    class TemplatesPanel(BaseTemplatesPanel):
        def generate_stats(self, *args):
            template = self.templates[0]['template']
            if not hasattr(template, 'engine') and hasattr(template, 'backend'):
                template.engine = template.backend
            return super().generate_stats(*args)
    

**settings.py**

    
    
    DEBUG_TOOLBAR_PANELS = [
        'debug_toolbar.panels.versions.VersionsPanel',
        'debug_toolbar.panels.timer.TimerPanel',
        'debug_toolbar.panels.settings.SettingsPanel',
        'debug_toolbar.panels.headers.HeadersPanel',
        'debug_toolbar.panels.request.RequestPanel',
        'debug_toolbar.panels.sql.SQLPanel',
        'debug_toolbar.panels.staticfiles.StaticFilesPanel',
        'myapp.debug.TemplatesPanel', # original broken by django-jinja, remove this whole block later
        'debug_toolbar.panels.cache.CachePanel',
        'debug_toolbar.panels.signals.SignalsPanel',
        'debug_toolbar.panels.logging.LoggingPanel',
        'debug_toolbar.panels.redirects.RedirectsPanel',
    ]
    

