Как настроить django 1.8 для использования jinja2?

Итак, теперь, когда django официально поддерживает Jinja 2 в качестве движка шаблонов, я надеялся, что включить его будет так же просто, как переключить строку в конфигурации. Но когда я делаю это, Джинджа не может найти мои шаблоны.

Насколько я понимаю, я мог бы вручную настроить список каталогов для поиска шаблонов, но я бы хотел, чтобы он вел себя точно так же, как DTL ведет себя по умолчанию. (т.е. посмотрите в каталог /templates). По сути, мое приложение структурировано так, как это предлагается в официальном руководстве, и я хотел бы использовать jinja, не меняя ничего другого. Является ли это возможным?

Вот как выглядит мой файл setings.py:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'APP_DIRS': True,
    },
]

Я получаю ошибку TemplateDoesNotExist at /

и вот моя структура каталогов:

mysite
    mysite
    myapp
        templates
            myapp  
                index.html
    manage.py

обратите внимание, что я надеюсь не использовать какие-либо внешние модули.

отредактируйте: как требуется, вот код, вызывающий шаблон:

def index(request):
    return render(request, 'myapp/index.html')

4 ответа

Решение

Папка шаблонов Jinja для папок приложения по умолчанию jinja2 не стандарт templates папка.

Поэтому попробуйте следующую структуру каталогов, и Django найдет ваши шаблоны Jinja:

mysite
    mysite
    myapp
        jinja2
            myapp  
                index.html
    manage.py

Еще одна вещь, которую следует учитывать, это то, что render_to_response не может принимать context_instance для шаблонов jinja2

https://github.com/django-haystack/django-haystack/issues/1163

Я верю, но я могу ошибаться, но я думаю, что jinja2 не может использовать тот же каталог, что и шаблоны django. пытаться

TEMPLATES = {
    'BACKEND': 'django.template.backends.jinja2.Jinja2',
    'DIRS': [os.path.join(PROJECT_ROOT, 'jinja2'),],
    'APP_DIRS': True,
}

Бэкэнд шаблона Jinja2 ищет jinja2 папка в каталогах приложений, а не templates, Это позволяет избежать путаницы в шаблонах DTL и Jinja2, особенно если вы включаете несколько шаблонизаторов в своем проекте.

Я бы порекомендовал придерживаться поведения по умолчанию и переименовать ваш templates каталог для jinja2, Однако, если вам нужно изменить его, вы можете создать пользовательский бэкэнд и установить app_dirname,

from django.template.backends.jinja2 import Jinja2

class MyJinja2(jinja2):
    app_dirname = 'templates'

Тогда в вашем TEMPLATES настройка, использование path.to.MyJinja2 вместо django.template.backends.jinja2.Jinja2,

Папка шаблонов Jinja для папок приложения по умолчанию - jinja2, а не стандартная папка шаблонов.

Поэтому попробуйте следующую структуру каталогов, и Django найдет ваши шаблоны Jinja:

mysite mysite myapp jinja2 myapp
index.html manage.py

И вместо: return render(request, 'myapp/index.html') вы должны написать: return render(request, 'index.html')

Другие вопросы по тегам