簡體   English   中英

Jinja2模板選項在測試中不起作用,但是在運行服務器時很好

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM