web-dev-qa-db-ja.com

Django 1.8でjinja2をテンプレートエンジンとして使用する方法

Django 1.8でjinja2を使用する方法を探していましたが、jinja2でDjangoを使用するための完全なソースはありません。 Djangoでjinja2を使用するためのプロセス。公式ドキュメントに目を通し、次の質問を見ました。 How to setup Django 1.8 to jinja2?を使用するには?

しかし、それらのどれもjinja2をひとまとめにして使用する方法を明確に説明していません。 Django=を使い始めたばかりで、ドキュメント内のすべての用語を知らない。本当に助かります。

21
biiiju

最初にインストールする必要があるjinja2

$ pip install Jinja2

次に、settings.pyTEMPLATESリストを変更して、jinja2BACKEND

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.urls import reverse

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

これにより、staticおよびurlがJinja2テンプレートで使用可能になります。

P.S。詳細については、 この記事 を参照してください。

23
doru

すべてを理解するのにかなりの時間を費やしましたが、ここでの答えはそれほど役に立ちませんでした。

ドルの答えは真実に最も近いが、不完全である。

テンプレート言語として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をビューのどこにでもインポートする必要がなくなり、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ディレクトリでテンプレートを検索します。 (templatesフォルダーを検索するDTLとは異なります)。その動作を変更する場合、または拡張機能の一致、フィルタリング、グローバル変数などの追加の調整が必要な場合は、Django-jinja拡張機能をご覧ください。

設定のTEMPLATES['DIRS']オプションを使用して、テンプレートを検索するための追加のディレクトリを提供することもできます。

7
IvanX

Mixed Django and Jinja2 Template:Environment: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" %}
1
Kostyantyn

settings.pyのDjango website から(詳細についてはこちらをご覧ください):

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

BACKENDは、DjangoのテンプレートバックエンドAPIを実装するテンプレートエンジンクラスへのドット付きPythonパスです。組み込みのバックエンドはDjango.template.backends.Django.DjangoTemplatesおよびDjango.template.backends.jinja2.Jinja2です。

基本的に、settings.pyファイルのどこにTEMPLATES変数があるかを調べ、バックエンドを設定します(またはバックエンドがJingaが組み込まれているため)。すべてが失敗した場合は、Django.template.backends...Django.template.backends.jinja2.Jinja2に置き換えます(必要ではないと思いますが)。

0
nonamorando