如何在Django 1.8中使用jinja2作为模板引擎

bii*_*iju 23 python django jinja2

我一直在研究如何在django 1.8中使用jinja2,但是没有完整的源代码来使用django和jinja2.我想知道你们是否知道在django中使用jinja2的过程.我查看了官方文档并查看了以下问题:如何设置django 1.8以使用jinja2?

但是他们都没有清楚地解释如何以一种放弃的方式使用jinja2.我刚开始使用django并且不知道文档中的所有术语.我真的很感激帮助.

dor*_*oru 24

首先你必须安装jinja2:

$ pip install Jinja2
Run Code Online (Sandbox Code Playgroud)

然后修改settings.py中TEMPLATES列表以包含: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',
           ],
        },
    },
]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这使得staticurl在您所在的Jinja2模板.

PS有关详细信息,请参阅此文章.

  • 我们如何添加context_processors? (2认同)

Iva*_*anX 7

花了我一些时间来弄清楚一切,这里的答案并不是那么有用.

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
Run Code Online (Sandbox Code Playgroud)

2.将jinja2后端添加到django项目设置文件,包括我们修改过的环境.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': "main.jinja2.environment",
        },
    },
    ...
]
Run Code Online (Sandbox Code Playgroud)

3.现在你不再需要在任何地方导入jinja2,在你的视图中,你将像django模板一样通过django使用jinja模板:

from django.shortcuts import render

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

最后,将APP_DIRS设置为True,jinja将搜索所有已安装的应用程序jinja2目录中的模板.(与搜索templates文件夹的DTL不同).如果你想改变那种行为,或者想要一些额外的调整,比如扩展匹配,过滤或全局变量,你应该看看django-jinja扩展.

您还可以通过TEMPLATES['DIRS']设置选项提供其他目录来搜索模板.

  • ❝Django 2.0 删除了 django.core.urlresolvers 模块,该模块在 1.10 版本中移至 django.urls。您应该更改任何导入以使用 django.urls。❞ 请参阅 /sf/answers/3019758521/ (2认同)

non*_*ndo 0

来自 Django网站(请查看此以获得进一步指导)settings.py

\n\n
TEMPLATES = [\n    {\n        \'BACKEND\': \'django.template.backends.django.DjangoTemplates\',\n        \'DIRS\': [],\n        \'APP_DIRS\': True,\n        \'OPTIONS\': {\n            # ... some options here ...\n        },\n    },\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

BACKEND 是实现 Django\xe2\x80\x99s 模板后端 API 的模板引擎类的点分 Python 路径。内置后端是 django.template.backends.django.DjangoTemplates 和 django.template.backends.jinja2.Jinja2。

\n
\n\n

基本上找出 settings.py 文件中的何处有 TEMPLATES 变量并设置后端(或确保后端)与上面的类似(因为 Jinga 是内置的)。如果全部失败,请将其替换django.template.backends...django.template.backends.jinja2.Jinja2(尽管我认为没有必要)。

\n