Подтвердить что ты не робот

Как использовать jinja2 в качестве шаблонизатора в Django 1.8

Я смотрел, как использовать jinja2 в django 1.8, но нет полного источника для использования django с jinja2. Мне было интересно, знаете ли вы, что вы используете jinja2 в django. Я просмотрел официальную документацию, и я рассмотрел следующий вопрос: Как настроить django 1.8 для использования jinja2?

но ни один из них не ясно объясняет, как использовать jinja2 в методе put-togther. Я только начал использовать django и не знаю всех жаргонов в документах. Я очень благодарен за помощь.

4b9b3361

Ответ 1

Фрист вам нужно установить jinja2:

$ pip install Jinja2

Затем измените свой TEMPLATES список в settings.py, чтобы он содержал jinja2 BACKEND:

TEMPLATES = [

    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [os.path.join(BASE_DIR, 'templates/jinja2')],
        'APP_DIRS': True,
        'OPTIONS': {'environment': 'myproject.jinja2.Environment',}, 
    },
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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',
           ],
        },
    },
]

где templates/jinja2 - это каталог с вашими файлами шаблонов jinja2.

И в файле views.py:

from __future__ import absolute_import  # Python 2 only
from jinja2 import Environment
from django.contrib.staticfiles.storage import staticfiles_storage
from django.core.urlresolvers import reverse

def environment(**options):
    env = Environment(**options)
    env.globals.update({
       'static': staticfiles_storage.url,
       'url': reverse,
    })
    return env

Это делает static и url доступными в ваших шаблонах Jinja2.

P.S. Подробнее см. в этой статье.

Ответ 2

Мне потребовалось некоторое время, чтобы разобраться во всем, ответы здесь были не очень полезными.

Ответ дору ближе всего к истине, но является неполным.

Как использовать jinja в качестве языка шаблонов:

1. Создайте файл jinja2.py в папке проекта. Это необходимо для изменения среды jinja2 по умолчанию (в нашем случае, передачи некоторых дополнительных глобальных переменных).

местоположение: {root}/main/jinja2.py:

from __future__ import absolute_import  # Python 2 only
from jinja2 import Environment
from django.contrib.staticfiles.storage import staticfiles_storage
from django.core.urlresolvers import reverse

def environment(**options):
    env = Environment(**options)
    env.globals.update({
       'static': staticfiles_storage.url,
       'url': reverse,
    })
    return env

2.Добавьте базу данных jinja2 в файл настроек проекта django, включая нашу измененную среду.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': "main.jinja2.environment",
        },
    },
    ...
]

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

from django.shortcuts import render

def index(request, **kwargs):
    return render(request, "index.html.j2", {'title': 'MyTitle', 'text': "MyText"})

И, наконец, с APP_DIRS, установленным в True jinja, будут искать шаблоны во всех установленных каталогах приложений jinja2. (в отличие от DTL, который ищет папку templates). Если вы хотите изменить это поведение или хотите получить дополнительную настройку, например, соответствие расширений, фильтрацию или глобальные переменные, вы должны посмотреть расширение django-jinja.

Вы также можете предоставить дополнительные каталоги для поиска шаблонов с помощью параметра TEMPLATES['DIRS'] параметров.

Ответ 3

На веб-сайте Django (см. это для дальнейших инструкций) в settings.py:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]

BACKEND - это точечный путь Python к классу ядра шаблона, реализующий API-интерфейс шаблона Djangos. Встроенные серверы - это django.template.backends.django.DjangoTemplates и django.template.backends.jinja2.Jinja2.

В основном выясните, где в вашем файле settings.py есть переменная TEMPLATES и установите бэкэнд (или убедитесь, что бэкэнд) похож на тот, что указан выше (поскольку встроенный Jinga). Если все не удается, замените django.template.backends... на django.template.backends.jinja2.Jinja2 (хотя я не думаю, что это необходимо).

Ответ 4

Смешанный Django и Jinja2 Шаблон: Окружающая среда: Django 1.8 + Jinja2.

У меня есть некоторые устаревшие шаблоны Django, и вам не так просто переписать их сразу на Jinja2, поэтому добавьте этот пользовательский тег {% jinja_include "some_template.jinja" %} в my_custom_tags.py:

from django.template.loader import get_template
from django import template
register = template.Library()

@register.simple_tag(takes_context=True)
def jinja_include(context, filename):
    template = get_template(filename)
    return template.render(context.flatten())

Назовите его так же, как ваш шаблон Django:

{% load my_custom_tags %}
{% jinja_include "some_template.jinja" %}