[英]Jinja2 templating options not working in test, but are fine when running server
我收到以下錯誤...
ERRORS:
?: (templates.E001) You have 'APP_DIRS': True in your TEMPLATES but also specify 'loaders' in OPTIONS. Either remove APP_DIRS or remove the 'loaders' option.
...嘗試使用Django 1.11及其標准測試運行程序運行任何測試套件時。
manage.py runserver
可以正常工作。
我將錯誤追溯到jinja2模板。 我的Django TEMPLATES設置如下所示:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(BASE_DIR, 'jinja2')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
'environment': 'mysite.jinja2.environment',
},
},
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [os.path.join(BASE_DIR, 'templates')],
"APP_DIRS": True,
'OPTIONS': {
'debug': DEBUG,
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.template.context_processors.i18n',
'django.template.context_processors.media',
'django.template.context_processors.static',
'django.template.context_processors.tz',
'django.contrib.messages.context_processors.messages',
'mysite.context_processors.app_rendering_ctx',
],
},
},
]
您會看到兩個OPTIONS
字典中都沒有loaders
鍵,因此該錯誤非常令人困惑。
剝離后,與上下文處理器或環境無關。 這與jinja2
模板有關...
從第一個條目中刪除APP_DIRS
項即可運行測試:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(BASE_DIR, 'jinja2')],
'OPTIONS': {
#stuff
},
},
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [os.path.join(BASE_DIR, 'templates')],
"APP_DIRS": True,
'OPTIONS': {
#stuff
},
},
]
但是現在我在我的應用程序目錄中找不到jinja2
模板,因此訪問該網站會出現TemplateNotFound
錯誤(當然!)。
jinja2模板引擎是否將loaders
密鑰動態附加到其自己的選項字典? 當服務器愉快地運行時,為什么測試運行程序失敗了?
我不會在此選擇答案,因為這是一種解決方法,而不是解決方案...但是其他人可以通過手動將他們要搜索的APP_DIRS添加到DIRS鍵中來解決此問題:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(BASE_DIR, 'jinja2'),
os.path.join(BASE_DIR, '..', 'myapp', 'jinja2'),
os.path.join(BASE_DIR, '..', 'myotherapp', 'jinja2')],
'OPTIONS': {
#stuff
},
},
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [os.path.join(BASE_DIR, 'templates')],
"APP_DIRS": True,
'OPTIONS': {
#stuff
},
},
]
當然,如果您有很多應用程序,這既不是通用解決方案,也不是容易復制的。 對於它的一些罰款。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.