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

12 浏览
0 Comments

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

我一直在寻找如何在django 1.8中使用jinja2的方法,但没有完整的资源可以用于使用django和jinja2。我想知道你们是否知道在django中使用jinja2的过程。我已经查阅了官方文档,并查看了以下问题:如何设置django 1.8以使用jinja2? 但是它们都没有清楚地解释如何以一种完整的方式使用jinja2。我刚开始使用django,不了解文档中的所有术语。非常感谢你的帮助。

0
0 Comments

在Django 1.8和Jinja2环境下,我有一些遗留的Django模板,一次性重写它们为Jinja2并不容易,因此我在my_custom_tags.py中添加了自定义标签{% jinja_include "some_template.jinja" %}。

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

这个问题的出现是因为我在Django项目中有一些遗留的模板,这些模板使用的是Django的模板语法,而我想要将它们重写为Jinja2模板语法。然而,一次性重写所有模板并不容易,因此我需要找到一种方法在Django中使用Jinja2作为模板引擎。

为了解决这个问题,我创建了一个名为my_custom_tags.py的文件,并在其中定义了一个名为jinja_include的自定义标签。这个标签接受一个文件名作为参数,并使用get_template函数加载Jinja2模板。然后,使用render方法渲染该模板,并返回渲染后的内容。

在Django模板中,我通过加载my_custom_tags标签库并调用jinja_include标签来使用Jinja2模板。这样,我就可以在Django中使用Jinja2作为模板引擎了。

通过这种方法,我可以逐步将遗留的Django模板重写为Jinja2模板,而不需要一次性重写所有模板。这样,我可以更方便地迁移到Jinja2,并享受到Jinja2带来的一些优势。

0
0 Comments

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

最近花了很多时间才弄明白一切,这里的答案并没有太大帮助。

doru的回答接近事实,但是不完整。

如何使用Jinja作为模板语言:

1.在项目文件夹中创建jinja2.py文件。这是为了修改默认的Jinja2环境(在我们的例子中,传递一些额外的全局变量)。

位置:{root}/main/jinja2.py:

from __future__ import absolute_import  # 仅适用于Python 2
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.在Django项目的设置文件中添加Jinja2后端,包括我们修改过的环境。

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

3.现在你不再需要在任何地方导入Jinja2,在你的视图中,你将通过Django使用Jinja模板,就像使用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不同,DTL会搜索templates文件夹)。如果你想改变这种行为,或者想要一些额外的调整,比如扩展匹配、过滤器或全局变量,你应该看看django-jinja扩展。

你也可以通过设置选项的TEMPLATES['DIRS']来提供额外的模板搜索目录。

“Django 2.0移除了django.core.urlresolvers模块,在1.10版本中移动到了django.urls。你应该修改任何import来使用django.urls。”参见stackoverflow.com/a/43139407

0
0 Comments

在Django 1.8中如何使用jinja2作为模板引擎的原因是希望能够在Django中使用jinja2的模板语法和功能。为了实现这个目标,需要按照以下步骤进行操作:

首先,需要安装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模板中使用`static`和`url`函数。

需要注意的是,使用context_processors与jinja2模板是不推荐的。而且,jinja2的APP_DIRS没有效果。在设置中,将environment配置为`myproject.jinja2.Environment`是错误的,正确的写法应该是`myproject.jinja2.environment`(小写的'e')。前者加载的是内置的Environment类,不包含自定义的函数'static'和'url'。

通过以上步骤,就能够在Django 1.8中使用jinja2作为模板引擎了。更多详细信息可以参考该文章:[http://jonathanchu.is/posts/upgrading-jinja2-templates-django-18-with-admin/](http://jonathanchu.is/posts/upgrading-jinja2-templates-django-18-with-admin/)。

0