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

时间:2015-06-08 05:13:57

标签: python django jinja2

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

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

4 个答案:

答案 0 :(得分:23)

首先你需要安装jinja2

$ pip install Jinja2

然后修改 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',
           ],
        },
    },
]

其中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

这使您的Jinja2模板中可以使用staticurl

P.S。有关详细信息,请参阅this article

答案 1 :(得分: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

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

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

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

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']设置选项提供其他目录来搜索模板。

答案 2 :(得分:1)

混合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" %}

答案 3 :(得分:0)

来自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(尽管我认为没有必要)。