2016-07-25 61 views
1

我剛剛嘗試在新計算機上運行現有的Django項目,並且遇到了django-debug-toolbar問題。這似乎與Jinja2有關。這裏的堆棧跟蹤:django-debug-toolbar:'模板'對象沒有屬性'引擎'

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' 

我使用的Django使用Jinja2 Jinja2的要融入我的項目,而在此之前的工作不錯,但現在似乎在期待這個template變量是一個普通的Django模板。在我的TEMPLATES設置中,我設置了Jinja2和DjangoTemplates,Jinja2使用特定的擴展名('tmpl')確保Jinja2只使用那些模板,其他所有模板都可以通過DjangoTemplates後端。

在Jinja2中使用django調試工具欄之前有沒有人看到過這個錯誤?如果需要,我可以發佈更多設置。

編輯:按照要求,這裏是我的模板設置:

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", 
      ] 
     } 
    } 
] 

更新 - 我已經通過在調試工具欄源的小代碼變「固定」的問題:改變線路175 debug_toolbar/panels/templates/panel.py來自:

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

到:

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'])) 

我還沒有看過爲什麼這個工程(對於一些人來說,調試工具欄1.5和django-jinja 2.2.0的這個組合工作正常),但我注意到Jinja2模板具有backend屬性,並且Django模板具有engine屬性,並且兩者似乎都用於同樣的事情。

回答

2

我得到這個也一樣,你可以破解它修好根據您的建議,而不通過提供自己的面板類黑客核心:

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', 
] 
0

self.template可能是空的,我想這是由於緩存......在任何情況下, 需要更換:

template = self.templates[0]['template'] 

template = None 
try: 
    template = self.templates[0]['template'] 
except IndexError: 
    pass 
相關問題